シェルスクリプトをバイナリ化する「shc」
シェルスクリプトをバイナリ化する「shc」の紹介です。
1.はじめに
シェルスクリプト(bash等)はテキスト形式のプログラムのため、スキルのある人が読めば、その内容が解読されてしまいます。
ですが、shc(Shell Script Compiler)を利用すれば、スクリプトがバイナリ化されるので、解読される心配がなくなります。
たとえば、他のサーバにログインする際、知られたくないユーザーやパスワードの記述が可能です。
2.インストール
yumコマンド等でもインストールできるようですが、ここではパッケージをダウンロードしてビルドする手順で説明します。
shcのパッケージは下記のURLよりダウンロードします。
https://neurobin.org/projects/softwares/unix/shc/
Linux環境にアップロードし、ダウンロードしたアーカイブを展開します。
展開するとshc-releaseディレクトリができるので、そのディレクトリに移動し、
# ./configure
# make
# make install
を実施します。
コマンドの実行結果は下記です。
# ./configure
./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for unistd.h... (cached) yes
checking for struct stat.st_rdev... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking whether time.h and sys/time.h may both be included... yes
checking for sys/time.h... yes
checking for unistd.h... (cached) yes
checking for alarm... yes
checking for working mktime... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible realloc... yes
checking for memset... yes
checking for putenv... yes
checking for strchr... yes
checking for strdup... yes
checking for strrchr... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: executing depfiles commands
# make
Making all in src
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
gcc -DPACKAGE_NAME=\"shc\" -DPACKAGE_TARNAME=\"shc\" -DPACKAGE_VERSION=\"4.0.3\" -DPACKAGE_STRING=\"shc\ 4.0.3\" -DPACKAGE_BUGREPORT=\"http://github.com/neurobin/shc/issues\" -DPACKAGE_URL=\"\" -DPACKAGE=\"shc\" -DVERSION=\"4.0.3\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRUCT_STAT_ST_RDEV=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_ALARM=1 -DHAVE_STDLIB_H=1 -DHAVE_REALLOC=1 -DHAVE_MEMSET=1 -DHAVE_PUTENV=1 -DHAVE_STRCHR=1 -DHAVE_STRDUP=1 -DHAVE_STRRCHR=1 -I. -g -O2 -MT shc.o -MD -MP -MF .deps/shc.Tpo -c -o shc.o shc.c
mv -f .deps/shc.Tpo .deps/shc.Po
gcc -g -O2 -o shc shc.o
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[1]: `all-am' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
# make install
Making install in src
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
make[2]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
/bin/mkdir -p '/usr/local/bin'
/usr/bin/install -c shc '/usr/local/bin'
make[2]: `install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[2]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[2]: `install-exec-am' に対して行うべき事はありません.
/bin/mkdir -p '/usr/local/share/man/man1'
/usr/bin/install -c -m 644 shc.1 '/usr/local/share/man/man1'
make[2]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
インストールするとshcコマンドが有効になります。
# shc
shc parse(-f): No source file specified
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f script
3.使い方
簡単なサンプルで説明します。
下記の内容を「sample.sh」で保存します。
#!/bin/bash
echo "OK"
このスクリプトをバイナリ化するには、下記のように実行します。
shc -f sample.sh -o sample.sh.x
"-f"にシェルスクリプトを指定し、"-o"に出力ファイルを指定します。
実行すると下記の2つのファイルが生成されます。スクリプトとして使用するのは、sample.sh.xの方です。
- sample.sh.x.c:C形式のファイル
- sample.sh.x:バイナリ化されたファイル
拡張子は".sh.x"でなくても問題ないようです。
パラメータは他にも色々あるので、manコマンドで調べて下さい。
4.注意事項
バイナリ化したファイルを他のサーバで再利用したい場合、必ず"-r"オプションをつけてください。
shc -f sample.sh -o sample.sh.x
"-r"オプションを付与せず他のサーバで実行しても正常に動作しません。
請求書の表記変更について
販売させて頂いているプラグインについて、請求書や見積書を提示させて頂くことがよくあるのですが、最近、CSVDataImExporterプラグイン(MT6→MT7バージョンアップ)の請求書の記載内容について修正を依頼される企業様がいらっしゃいましたので、その経緯を備忘録として残しておきます。
ちなみに、当方では「ZOHO INVOICE」というオンラインサービスを利用させて頂いており、デフォルトのフォーマットで対応させて頂いてます。
1.1回目の修正依頼内容
- 請求日:6月の日付に変更
- 支払期限:7月末に変更
- 利用開始日:7月1日に変更
このあたりの修正は時々行っており、これで作業が終了するのですが、追加で2回目の修正依頼がきました。
2.2回目の依頼内容
- 価格表記:税抜き価格・消費税金額・税込み価格など項目名の詳細明記の依頼(案を提示したところ、ご要望にそぐわなかったようで3回目で記載内容が提示されました)
- 利用開始日:月日のみのため、年月日の表記に修正依頼
- 詳細欄の「差額」の表記を具体的に記載の依頼
- 「総額」「残額」という表記が分かりづらいため「請求金額」に修正依頼
ちなみに「利用開始日」は、1回目の依頼でご要望通りに修正したはずですが、お詫びの言葉もなく、追加の修正を依頼されました。
私が逆の立場であれば、相手の心情を察して「修正して頂いたところ大変申し訳ありませんが」の一言は添えると思います。
そして、修正した請求書にまだご納得頂けないようで、3回目の依頼が届きました。
3.3回目の依頼内容
- 「ご請求金額 ¥xx,xxx(税込)」を追加してフォントを大きく表示してほしい(うーん…という感じです)
- 「残額」欄の削除
- 「支払い条件」欄の削除
- 内訳の追記(下記、価格部分を除き原文のまま)
MT7版
※現在利用中の以下「MT6カスタムフィールド対応版」との差額が請求額となります。
<内訳>
○MT6カスタムフィールド対応版(現在ご利用分):
\xx,xxx-(税抜き価格)
※1行空き
○MT7版(今回ご購入分):
\xx,xxx-(税抜き価格)
※1行空き
上記、MT6カスタムフィールド対応版とMT7版との差額=請求金額:
\xx,xxx-(税抜き価格)
この段階で、まだ修正依頼がありそうと予感し、フォントの拡大等、当方で利用しているサービスのフォーマットが受け入れられないようなので、Excel等での請求書フォーマットの提示を要望したのですが、
「弊社は請求システムから生成された請求書を使用しており、Excelフォーマットの形ではご用意できない状況です」
という返答がかえってきました。
そういうことではなく、お互いに効率よく作業を進められる方法のご提案だったのですが。
あと、こちらも「請求システムから生成された請求書」を使用しているのですが。
また、なぜここまで記載の変更・修正を要望されているのか確認したところ、
「監査上、第3者が見て分かりやすい表記内容を求められるため、商取引における一般的な請求書内容を踏まえ、ご相談させていただいた次第です」
との回答でした。
私が利用しているZOHO INVOICEのデフォルトフォーマットは「一般的な請求書内容」ではないようです。申し訳ありません。
なお、一部対応できないことをお伝えしたところ、4回目の依頼がきました。
4.4回目の依頼内容
- 「総額」を「請求金額」に変更
- 「残額」欄の削除(2回目)
- 「支払い条件」欄の記載変更
ここまでの依頼について修正し、ようやく納得頂けました。
5.総括
やりとりの経緯は以上です。
私の利用している請求書の、いわゆるフォーマットが一般的でないかもしれないことについては申し訳なく思います。
ただ、相当数のライセンス販売で、請求書の記載内容の修正依頼がきたのはこれが初めてで、1度にまとめての依頼であればまだしも、度重なる修正依頼は相当のプレッシャーで、正直、精神的にかなり疲れてしまいました。
そして、この企業様以外の多くの企業様・事業主様は、当方の提示する請求書等を快く受領して頂き、本当に感謝しております。ありがとうございます。
今後も引き続きよろしくお願い致します。
MySQLのrootログインで「Access denied for user 'root'@'localhost' (using password: YES)」に遭遇した場合の対処
MySQLのrootログインで「Access denied for user 'root'@'localhost' (using password: YES)」に遭遇した場合の対処方法を紹介します。
1.問題点
MySQLをインストールし、mysqldサービスを起動し、mysqladminコマンドでrootログインをしようとしたところ、下記のエラーに遭遇しました。
# mysqladmin -u root password -p
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'
ちなみにrootの初期パスワードは、
/var/log/mysqld.log
2023-08-26T06:33:00.897137Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: :Vqw<Poh0:gY
の行末に記録されています。
ただ、今回はこのパスワードを設定しても上記のエラーに遭遇しました。
2.対処
手順は下記の通りです。
- /etc/my.cnf または /etc/mysql/my.cnf を任意のエディタで開く
- "[mysqld]"の下に「skip-grant-tables under」を追加
- mysqldを再起動
- 「mysql -u root -p」を実行し、パスワードを聞かれても入力せずにリターン(これでログインできる)
- プロンプトが「mysql>」になったら「flush privileges;」を入力(権限の反映)
- 「ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';」を実行(NewPasswordには新しいパスワードを設定)
- quitでmysqlを終了し、再度「mysql -u root -p」を実行。先ほどのパスワードでログインできることを確認
- OKであれば、my.cnfに追加した設定「skip-grant-tables under」を削除
- mysqldを再起動
3.参考サイト
参考サイトは下記です。ありがとうございました。
ansibleで踏み台サーバ経由でplaybookを実行する方法
ansibleで踏み台サーバ経由でplaybookを実行する方法を紹介します。
1.問題点
ansibleで下記のような構成でゲストOSを構築することになりました。
ansible実行サーバ
↓
ターゲットのホストOS
↓
ターゲットのゲストOS
ansibleサーバから構築対象のゲストOSを操作するには、ホストOSへ一度ログインしなければならないのですが、方法がわかりません。
ということで、ansibleで踏み台サーバ経由でplaybookを実行する方法を紹介します。
2.ansibleで踏み台サーバ経由でplaybookを実行する
ansibleで踏み台サーバ経由でplaybookを実行するには、ansible実行ディレクトリに下記の内容を記述したansible.cfgを配置します。
[ssh_connection]
ssh_args = '-o ControlMaster=auto
-o ControlPersist=60s
-o StrictHostKeyChecking=no
-o UserKnownHostsFile=/dev/null
-o ProxyCommand="sshpass -p [ホストOSのパスワード] ssh -W %h:%p -q [ホストOSのユーザー]@[ホストOSのIPアドレス]"'
3.解説
ControlMaster=auto
ControlPersist=60s
は、2本目以降のsshの接続が早くなる設定です。
StrictHostKeyChecking=no
は、ホスト鍵を無視する設定です。
UserKnownHostsFile=/dev/null
は、デフォルトのknown_hostsの代わりに使用するファイルの設定です。
/dev/nullで、known_hostsに書き込まれることがなくなります。
ProxyCommand="sshpass -p [ホストOSのパスワード] ssh -W %h:%p -q [ホストOSのユーザー]@[ホストOSのIPアドレス]"'
で踏み台を超える設定を行います。
4.参考サイト
参考サイトは下記です。ありがとうございました。
OpenSSLで文字列を暗号化・複号化する方法
OpenSSLで文字列を暗号化・複号化する方法を紹介します。
1.問題点
hogeという文字列を暗号化し、暗号化された文字列を複号化したいのですが方法が分かりません。
ということで、OpenSSLで暗号化・複号化する方法を紹介します。
2.OpenSSLで暗号化する
暗号化するには下記のようにします。
$ echo "hoge" | openssl enc -e -aes-256-cbc -base64 -k "foo"
U2FsdGVkX19acdrHT5vEBfW4pIWx2B9CbEzE9yn+S7A=
暗号化の場合、"-e"を付与します。"-e"の後方に暗号スイート(CipherType)を指定します。ここでは「-aes-256-cbc」を指定します。
"-base64"でbase64エンコードした文字列を出力します。これを行わないと暗号化文字列が半角英数記号で表示されません。
$ echo "hoge" | openssl enc -e -aes-256-cbc -k "foo"
cd胄1d__w/l
漑輓
"-k"でパスワードを指定します。これを設定しないと暗号化時にパスワードを求められます。
$ echo "hoge" | openssl enc -e -aes-256-cbc -base64
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX18ZCcoBKxLDKZuP3HhHUinBMghKL0Gx3KI=
3.OpenSSLで復号化する
復号化するには下記のようにします。
# echo "U2FsdGVkX18ZCcoBKxLDKZuP3HhHUinBMghKL0Gx3KI=" | openssl enc -d -aes-256-cbc -base64 -k "foo"
hoge
復号の場合、"-d"を付与します。"-d"の後方に暗号スイート(CipherType)を指定します。ここでは暗号化時と同じ「-aes-256-cbc」を指定します。
"-base64"で暗号化文字列のデコードを行います。これを指定しないと複合化できません。
$ echo "U2FsdGVkX18ZCcoBKxLDKZuP3HhHUinBMghKL0Gx3KI=" | openssl enc -d -aes-256-cbc -k "foo"
bad magic number
"-k"でパスワードを指定します。これを設定しないと暗号化時にパスワードを求められます。
$ echo "U2FsdGVkX18ZCcoBKxLDKZuP3HhHUinBMghKL0Gx3KI=" | openssl enc -d -aes-256-cbc -base64
enter aes-256-cbc decryption password:
hoge
ansibleでrpmアーカイブを展開してyumでインストールする方法
ansibleでrpmアーカイブを展開してyumでインストールする方法を紹介します。
1.問題点
ansibleで実施したいコマンドは下記です(リモートホストの/tmpにpacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gzが配置されている前提で話を進めます)。
# ssh test_host
# cd /tmp
# tar xvfz pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz
# cd pacemaker-1.0.13-1.2.el6.x86_64.repo
# yum --disablerepo=* -c pacemaker.repo install -y pacemaker pm_crmgen pm_logconv-hb pm_diskd pm_extras --enablerepo=pacemaker
なお、pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gzを展開すると、直下にpacemaker.repoがあります。
このファイルをyumコマンドの"-c"オプションでリポジトリとして指定し、インストールしたいのですが、ansibleでの書き方が分かりません。
ということで、ansibleでアーカイブを転送してyumでインストールする方法を紹介します。
2.ansibleでアーカイブを転送してyumでインストールする
先にansibleのコードを掲載します。inventoryやtasksの記載は省略していますので、実行時に適宜追加してください。
- name: "pacemakerアーカイブの展開"
unarchive:
remote_src: yes
src: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz"
dest: "/tmp"
- name: "pacemakerインストール"
become: yes
become_method: su
yum:
name: "{{ packages }}"
conf_file: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/pacemaker.repo"
disablerepo: "*"
enablerepo: "pacemaker"
state: present
vars:
packages:
- pacemaker
- pm_crmgen
- pm_logconv-hb
- pm_diskd
- pm_extras
3.解説
まずリモートホストのアーカイブを展開します。
unarchive:
remote_src: yes
src: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz"
dest: "/tmp"
この詳細は「ansibleでリモートホストのアーカイブファイルを展開する方法」を参考にしてください。
次に、becomeで権限昇格(rootでの実行)を指定します。これはyumをrootで実行するためです。
become: yes
become_method: su
そしてyumモジュールでインストールします。
yum:
name: "{{ packages }}"
conf_file: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/pacemaker.repo"
disablerepo: "*"
enablerepo: "pacemaker"
state: present
nameはインストールパッケージを指定しますが、後で説明します。
conf_fileがyumコマンドの"-c"オプションに該当します。
conf_file: "{{ work_path }}/SIP/sip-common/RPM/pacemaker-1.0.13-1.2.el6.x86_64.repo/pacemaker.repo"
通常のyumの場合、実行前にpacemaker.repoファイルがあるパスに移動できるのですが、ansibleではcdができないので、conf_fileはフルパスでpacemaker.repoのパスを指定します。
また、今回はスタンドアローンでインストールしているので、不要なリポジトリにアクセスしないよう、下記のdisablerepoを追加しています。disablerepoの指定だけではpacemaker.repoがみつからず、エラーになるので、enablerepoでpacemaker.repoも指定します。
disablerepo: "*"
enablerepo: "pacemaker"
stateに指定するpresentは、"yum install"と同じ意味になるようです。
さて、パッケージを指定するnameですが、インストールパッケージが複数あるので、下記の方法で指定します。
yum:
name: "{{ packages }}"
:
vars:
packages:
- pacemaker
- pm_crmgen
- pm_logconv-hb
- pm_diskd
- pm_extras
varsモジュールの変数packages(変数名は任意)に書かれた配列の値が、nameの{{ packages }}に設定されます。
varsのインデントに気をつけてください。私はyumの中にvarsをインデントして入れてしまって、エラーの原因がわからず悩みました。
また、展開した中にあるpacemaker.repoの内容は
[pacemaker]
name=pacemaker
baseurl=file:///tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/
gpgcheck=0
enabled=1
となっていますが、pacemakerのアーカイブを展開するディレクトリが/tmp直下でない場合は、pacemaker.repoのbaseurlのパスが異なるため、このまま実行するとエラーになります。
よって、パスを書き換えたpacemaker.repoをコントロールホスト側に予め用意しておき、yum実行前に下記のansibleで上書きする操作が必要です。
- name: "pacemaler.repoを上書き"
copy:
src: pacemaker.repo
dest: "/配置パス/pacemaker-1.0.13-1.2.el6.x86_64.repo/"
ansibleでコマンドを実行する方法
ansibleでコマンドを実行する方法を紹介します。
1.問題点
下記のコマンドをansibleで実行したいのですが、方法がわかりません。
# echo "hoge"
ということで、ansibleでコマンドを実行する方法を紹介します。
ここでは基本的な実行方法のみを解説します。
2.ansibleでコマンドを実行する
ansibleでコマンドを実行するには、commandモジュールまたはshellモジュールを使用します。ここではcommandモジュールの例で記載します。
inventory
[all]
test_host ansible_host=192.168.1.23
test.yml
- hosts: test_host
tasks:
- name: コマンド実行
command: echo "hoge"
changed_when: false
実行
# ansible-playbook -i inventory test.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [コマンド実行] *************************************************************************************************
ok: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=0 unreachable=0 failed=0
3.解説
commandモジュールの中にcmdオプションを指定し、そこに実行したいコマンドを記述します。
command: echo "hoge"
changed_when: false
changed_whenは、実行結果でchangedと判断する条件を定義するモジュールで、ここでは必ずfalseを指定します。
3.changed_whenを指定する理由
changed_whenを指定する理由ですが、commandモジュールやshellモジュールでコマンドを実行する場合、実行結果が必ず”changed”になってしまいます。
以下は先のサンプルでchanged_whenを指定しなった場合の実行結果です。最後の行のchangedが"1"になっています。
# ansible-playbook -i inventory test4.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [コマンド実行] *************************************************************************************************
changed: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=1 unreachable=0 failed=0
このchangedを"0"にするために、changed_whenにfalseを指定します。
4.shellモジュールとcommandモジュールとの違い
shellモジュールは、"command"の部分を"shell"に書き換えればOKです。
- name: コマンド実行
shell: echo "hoge"
changed_when: false
commandモジュールとshellモジュールの違いは下記の通りです。
- command:ユーザ環境変数や、パイプ・リダイレクトを使用できない
- shell:ユーザ環境変数や、パイプ・リダイレクトを使用できる
よってコマンドによってcommandモジュールとshellモジュールを使い分けてください。
ansibleでリモートホストのアーカイブファイルを展開する方法
ansibleでリモートホストのアーカイブファイルを展開する方法を紹介します。
1.問題点
下記の操作をansibleで実施したいのですが、方法が分かりません。
# ssh 192.168.1.23
# cd /tmp
# tar zxvf hoge.tar.gz
ということで、ansibleでリモートホストのアーカイブファイルを展開する方法を紹介します。
2.ansibleでリモートホストのアーカイブファイルを展開する
先にansibleのコードを掲載します。
inventory
[all]
test_host ansible_host=192.168.1.23
test.yml
- hosts: test
tasks:
- name: "アーカイブの展開"
unarchive:
remote_src: yes
src: "/tmp/hoge.tar.gz"
dest: "/tmp"
実行
# ansible-playbook -i inventory test.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [アーカイブの展開] ********************************************************************************************
ok: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=0 unreachable=0 failed=0
3.解説
unarchiveはアーカイブを展開するモジュールです。
unarchive:
unarchiveのパラメータとしてremote_srcを指定します。これはリモートホストで展開することを示すパラメータです。このパラメータを指定しないと、srcに書かれたファイルをコントロールホストに配置されたファイルと認識して、リモートホストに転送する動作になります。
remote_src: yes
同様にsrcとdestを指定します。scrは転送元のパスとファイル、destは転送先のパスです。
src: "/home/hoge/hoge.tar.gz"
dest: "/tmp"
これで、リモートホストの/tmp/hoge.tar.gzを、/tmpに展開します。
ローカルホストに置かれたファイルをリモートホストに転送して展開する方法は「ansibleでアーカイブファイルを転送して展開する方法」をご覧ください。
ansibleでアーカイブファイルを転送して展開する方法
ansibleでアーカイブファイルを転送して展開する方法を紹介します。
1.問題点
下記の操作をansibleで実施したいのですが、方法が分かりません。
# scp /home/foo/hoge.tar.gz test_host:/tmp
# ssh 192.168.1.23
# cd /tmp
# tar zxvf hoge.tar.gz
ということで、ansibleでアーカイブファイルを転送して展開する方法を紹介します。
2.ansibleでアーカイブファイルを転送して展開する
先にansibleのコードを掲載します。
inventory
[all]
test_host ansible_host=192.168.1.23
test.yml
- hosts: test
tasks:
- name: "アーカイブの転送と展開"
unarchive:
src: "/home/hoge/hoge.tar.gz"
dest: "/tmp"
実行
# ansible-playbook -i inventory test.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [アーカイブの転送と展開] ********************************************************************************************
ok: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=0 unreachable=0 failed=0
3.解説
unarchiveはアーカイブを展開するモジュールです。
unarchive:
また、unarchiveのパラメータとしてsrcとdestを指定します。scrは転送元のパスとファイル、destは転送先のパスです。
src: "/home/hoge/hoge.tar.gz"
dest: "/tmp"
これで、/home/hoge/hoge.tar.gzを該当サーバに転送し、転送先の/tmpにアーカイブの展開結果を出力します。
なお、このansibleではリモートホストの/tmpにhoge.tar.gzは配置されませんのでご注意ください。
また、リモートホストに置かれたファイルを展開する方法は別の記事で紹介したいと思います。
ExcelのVBAからEdgeやChromeを操作する方法(その1:初期設定)
ExcelのVBAからEdgeやChromeを操作する方法を紹介します。
「その1」は、VBAの設定と、ブラウザ(Edge)が開くまでの手順を紹介します。
1.はじめに
以前、「iMacros」を使ってブラウザを操作する方法を紹介しましたが、VBAからGoogleChromeやEdgeを操作する方法をみつけたので何回かに分けて紹介したいと思います。
VBAを利用することで、ブラウザ上のフォームデータの入力やを送信もできるようです。
今回は下記の記事前半の手順を詳しく説明したものです。
Excel VBAでSeleniumBasicを使わずにスクレイピングする
2.Microsoft Edge WebDriverのダウンロード
Microsoft Edge WebDriverのサイトにアクセスして、少し下にある「最新バージョン」から、該当のEdgeバージョンのドライバをダウンロードします。
Edgeのバージョンの確認は、ブラウザ右側にある設定アイコンをクリックして、「ヘルプとフィードバック」→「Microsoft Edgeについて」をクリック。
次の画面でバージョン「114.0.1823.58」が表示されました。
さきほどアクセスしたサイトから、これと同じバージョンの該当OSのリンクをクリックしてダウンロード。私が使っているPCはWindowsの64bitなので、ここでは「x64」をクリックしています。
ダウンロードしたアーカイブを展開して、中にmsedgedriver.exeがあることを確認します(あとで利用します)。
Chromeで利用したい場合は、ChromeDriverのサイトからダウンロードしてください。
こちらもバージョンが一致している必要があります。
3.VBA-JSONのダウンロード
VBA-JSONのサイトにアクセスして、「Source code(zip)」または「Source code(tar.gz)」をクリックしてダウンロードします。
ダウンロードしたアーカイブを展開して、中にJsonConverter.basがあることを確認します(あとで利用します)。
4.VBAの設定
メニューにマクロが表示されていない場合は、まずメニューの表示設定をします。
・「ファイル」→「オプション」をクリックして開いた画面の「クイックアクセスツールバー」をクリック。
・左側のリストから「マクロ[マクロの表示]」をクリックして「追加」をクリックし、「OK」をクリック。
→バーにマクロのアイコンが表示される
ここからが本題です。
「表示」タブの「マクロ」→「マクロの表示」をクリック。
画面が開くので、マクロの名前に任意の名称(ここでは「test」)を入力して「作成」をクリック。
「Visual Basic Editor」が開きます。
プロジェクト・エクスプローラ上のツリーから[VBAProject(ファイル名)]を右クリックして、表示されたコンテキスト・メニューから[ファイルのインポート]を選択
[ファイルのインポート]ダイアログが開くので、「JsonConverter.bas」を選択し[開く]ボタンをクリック。
これで、プロジェクト・エクスプローラのツリーにもインポートしたモジュールが追加されます。
続いて、連想配列を扱うDictionary型を利用するための設定を行います。
VBEのメニューバーの「ツール」→「参照設定」をクリック。
「Microsoft Scripting Runtime」にチェックを入れて「OK」をクリック。
5.VBAにコード設定
関数「test」の中に、下記のコードを設定します。赤字の「C:\tmp\edgedriver_win64\msedgedriver.exe」には、2項でダウンロードしたmsedgedriver.exeをフルパスで指定してください。
Chromeの場合は「chromedriver.exe」を設定します。
Sub test()
' WebDriverの起動。デフォルトで9515番ポートを監視
Shell "C:\tmp\edgedriver_win64\msedgedriver.exe", vbMinimizedNoFocus
' ブラウザ起動パラメータの作成
Dim params As New Dictionary
params.Add "capabilities", New Dictionary
params.Add "desiredCapabilities", Nothing
' HTTPクライアントの起動
Dim client As Object
Set client = CreateObject("MSXML2.ServerXMLHTTP")
' 指示の送信
client.Open "POST", "http://localhost:9515/session"
client.setRequestHeader "Content-Type", "application/json"
client.send JsonConverter.ConvertToJson(params)
' 送信完了待ち
Do While client.readyState < 4
DoEvents
Loop
End Sub
実際の画面での追加は下記のようになります。
6.実行
「実行」→「Sub/ユーザーフォームの実行」をクリック。
EdgeまたはChromeが起動して、真っ白なページが表示されれば設定完了です。
sshログインに時間がかかる場合の対処
sshログインに時間がかかる場合の対処方法について紹介します。
1.問題
あるサーバから別のサーバにログインする際、ログインするまでに数十秒かかりました。
時間がかかる原因がわかりません。
ということで、sshログインに時間がかかる場合の対処方法について紹介します。
2.原因
今回は、sshの最初にDNSサーバにアクセスしているのが原因でした。
ホストのネームサーバを設定しているファイル
/etc/resolv.conf
の設定をみると、下記のようになっていました。
# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.0.1
nameserver 192.168.0.10
これらのアドレスにping6を送信しても応答がなく、ここ部分で遅延しているようです。
3.対処
ホストの
/etc/ssh/sshd_config
に、"UseDNS"の項目を無効にする設定を追加します。
変更前(コメントアウト)
#UseDNS yes
変更後
UseDNS no
上記設定後、sshd再起動します。
# systemctl restart sshd
これで解消すれば、sshログイン時にDNSサーバへのアクセスが問題であったことになります。
Movable Typeのコミュニティサイト「MTQ」が2023年7月31日に終了
Movable Typeのコミュニティサイト「MTQ」が2023年7月31日に終了するようです。
この記事で誤解を招かないよう、先にお伝えしておきたいことがあります。
コミュニティサイトは終了しますが、Movable Typeの現状とは何の関係もありません。
当サイトでのMovable Typeプラグインのライセンス購入や、私への開発依頼は、以前と特に変わらず推移しています。
Movable Type自体も、Movable Type 8が2023年秋にリリース予定です。
話を戻して、サイトのメニュー下にサービス終了の案内が表示されています。
過去のログを確認した限りですが、MTQは2011年に運用が開始されているようで、2023年6月6日現在までのトピックとコメントは次の通りです。
- トピック:2375
- コメント:6752
内訳は下の画像のとおりですが、テンプレートやタグについての質問が特に多かったようです。
このコミュニティサイトが立ち上がったときにすぐに登録し、活発にコメントさせて頂いたのはいい思い出です。
またこのサイトで、MTについて勉強させて頂いたことも多々ありました。
最近は新たなトピックも減り、トピックに対するコメントに対する反応も減ってきて、閑散とした状況が続いてました。
減少してきた要因として、推測ですが、個人利用のMTユーザーが減少してきた(=個人ユーザーが躓いたときの質問が減った)のではないかと思っています。
それにしたがい、(私含めて)パワーユーザーからのアクションも減少したように思われます。
それでも他の方が迅速に対応されているのに安心し、油断してしばらくMTQにアクセスしていない時期がありました。
久しぶりに訪れたところ、回答がないトピックが複数残っているのに気がつき、それ以降は定期的にMTQにアクセスして、しばらく一人でコメント対応する時期が続いたこともありました。
が、コミュニティサイトとしての役目を終える時期が訪れたようです。
非常に残念ですが、これも時代の流れでしょう。
最後に、MTQには大変お世話になり、本当にありがとうございました。
個人的な要望として、できればサイトは参照用として残して頂けるありがたいのですが、静かに見守りたいと思います。
Windows Updateで更新プログラムファイルをダウンロードしてコマンドでインストールする方法
Windows Updateで更新プログラムファイルをダウンロードしてコマンドでインストールする方法を紹介します。
1.はじめに
Windows Update「KB5026361」がエラーになり、インストールできなくなったので個別にWindows updateすることにしました。
2.Windows updateファイルの検索とダウンロード
MicrosoftUpdateカタログにアクセス。
該当の番号で「KB5026361」で検索すれば該当のWindows Updateファイル一覧が表示されます(注:タイミングによっては検索結果が表示されない場合があるので、次の日に再トライしてください)。
上記の画面はそのままにしておき、タスクバーの検索か、コマンドプロンプトからwinverを入力してWindowsのバージョンを確認します(「スタート」→「設定」→「システム」→「詳細情報」でも表示)。
例では「21H2」であることが分かります。
一覧から、「21H2」の候補は、
2023-05 Dynamic Cumulative Update for Windows 10 Version 21H2 for ARM64-based Systems (KB5026361)
2023-05 Cumulative Update for Windows 10 Version 21H2 for ARM64-based Systems (KB5026361)
2023-05 Cumulative Update for Windows 10 Version 21H2 for x86-based Systems (KB5026361)
2023-05 Dynamic Cumulative Update for Windows 10 Version 21H2 for x86-based Systems (KB5026361)
2023-05 Cumulative Update for Windows 10 Version 21H2 for x64-based Systems (KB5026361)
2023-05 Dynamic Cumulative Update for Windows 10 Version 21H2 for x64-based Systems (KB5026361)
の6つがありました。
次に、プロセッサとbit数で絞り込みます。
コマンドプロンプトから「msinfo32」を入力して、表示された画面の「システムの種類」を確認します。
ここでは「x64」となっていることから、
2023-05 Cumulative Update for Windows 10 Version 21H2 for x64-based Systems (KB5026361)
2023-05 Dynamic Cumulative Update for Windows 10 Version 21H2 for x64-based Systems (KB5026361)
の2つで、インストールするのは「Dynamic」がついている方です。
2023-05 Dynamic Cumulative Update for Windows 10 Version 21H2 for x64-based Systems (KB5026361)
一覧の右側にある「ダウンロード」をクリックして、次の画面で表示されたファイルをダウンロードします。
3.MicrosoftUpdateファイルのインストール
ファイルの拡張子によって実行方法が異なります。
拡張子が.msuファイルの場合、wusaコマンドで実行します。
コマンドラインは次のとおりです。
C:\WINDOWS\system32>wusa "c:\windows10.0-kb5025221-x64_4cd9fd91665e48fc9a7941376973e2e41c4308e2.msu" /quiet /norestart
サイトによっては「ファイルをexpandコマンドで展開してから実行」という記事もありますが、うまく実行できなかったので、wusaコマンドでの実行が適切と思われます。
なお、wusaコマンドは応答がすぐに戻ってくるので、どこまでWindowsUpdateが実行されているかの進捗は不明です。
拡張子が.cabファイルの場合、dismコマンドで実行します。
コマンドラインは次のとおりです。
C:\WINDOWS\system32>dism /online /add-package /PackagePath:"c:\windows10.0-kb5026361-x64_b31902e180d69a69a227a786e916a70e849402b2.cab" /NoRestart
dismコマンドは完了まで時間がかかる(数十分とか)場合があります。
4.参考
参考サイトは下記です。ありがとうございました。
jQueryでパスワードの表示・非表示を切り替えるサンプル
jQueryでフォームのパスワードの表示・非表示を切り替えるサンプルを紹介します。
1.はじめに
フォームのパスワードの表示・非表示を切り替える必要が生じたので、調べてみました。
この記事でサンプルを作ってみましたので、よければご利用ください。
2.サンプル
サンプルページから動作を確認できます。
3.ソース
コピー&ペーストでそのまま使えると思います。
<html lang="ja">
<head>
<meta charset="utf-8">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<style>
form {
font-size: 20px;
width: 300px;
position: relative;
}
#pass {
font-size: 20px;
width: 100%;
padding: 5px;
}
#eye {
position: absolute;
top: 50%;
right: 10px;
transform: translateY(-50%);
}
</style>
<script>
$(function(){
$('#eye').on('click', function() {
var pass = $("#pass").attr('type');
if (pass === "text") {
$("#pass").attr('type', 'password');
$("#eye").removeClass("fa-eye").addClass('fa-eye-slash');
} else {
$("#pass").attr('type', 'text');
$("#eye").removeClass("fa-eye-slash").addClass('fa-eye');
}
});
});
</script>
</head>
<body>
<form>
<input type="password" id="pass" value="">
<span id="eye" class="fa fa-eye-slash"></span>
</form>
</body>
</html>
以下、HTML、CSS、jQueryの解説です。
4.HTML
HTMLのform要素内にパスワードのフォームと表示・非表示切り替え用のアイコンを表示するspan要素を設定します。
<form>
<input type="password" id="pass" value="">
<span id="eye" class="fa fa-eye-slash"></span>
</form>
5.CSS
CSSは、パスワードのサイズと、非表示切り替え用のアイコンの配置に用いています。
formにwidthプロパティとpositionプロパティで"relative"を設定します。
#pass(パスワードフォーム)に、フォームの横幅を設定します(これを設定しないとデフォルトサイズになります)。
#eye(非表示切り替え用のアイコン)のpositionプロパティで"absolute"を設定して、top、rifht、transformで位置を調整します。
form {
font-size: 20px;
width: 300px;
position: relative;
}
#pass {
font-size: 20px;
width: 100%;
padding: 5px;
}
#eye {
position: absolute;
top: 50%;
right: 10px;
transform: translateY(-50%);
}
6.jQuery
#eyeにon(click)イベントを設定し、クリックされるとパスワードのtype属性を取得し、type属性が"text"の場合は値を"password"に変更し、アイコンを切り替えます。
type属性がpasswordの場合は値を"text"に変更し、アイコンを切り替えます。
$(function(){
$('#eye').on('click', function() {
var pass = $("#pass").attr('type');
if (pass === "text") {
$("#pass").attr('type', 'password');
$("#eye").removeClass("fa-eye").addClass('fa-eye-slash');
} else {
$("#pass").attr('type', 'text');
$("#eye").removeClass("fa-eye-slash").addClass('fa-eye');
}
});
});
7.アイコン表示
アイコンの表示は「Font Awesome」を利用して、下記の設定だけでアイコンが表示される仕組みになっています。
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
:
<span id="eye" class="fa fa-eye-slash"></span>
"fa-eye-slash"はスラッシュつきのアイコン、 "fa-eye"はスラッシュなしのアイコンです。
8.スラッシュの有無変更
サンプルは非表示の状態でスラッシュありのアイコンを表示(=現在の状態を表示)していますが、スラッシュの有無を逆にしたい場合は、HTMLおよびjQueryを下記の赤字にそれぞれ書き換えてください。
<span id="eye" class="fa fa-eye"></span>
if (pass === "text") {
$("#pass").attr('type', 'password');
$("#eye").removeClass("fa-eye-slash").addClass('fa-eye');
} else {
$("#pass").attr('type', 'text');
$("#eye").removeClass("fa-eye").addClass('fa-eye-slash');
mysqlやmysqldumpで「 [Warning] Using a password on the command line interface can be insecure.」という警告が表示される場合の対処
mysqlやmysqldumpで「 [Warning] Using a password on the command line interface can be insecure.」という警告が表示される場合の対処について紹介します。
1.問題点
さくらインターネットでMySQLのバックアップを取得しようと思い、下記のコマンドを実施しました。
$ mysqldump -h mysqlxxx.db.sakura.ne.jp -u hoge -phuga testdatabase > testdatabase.sql
これまでは実行できていたのですが、今回は下記の警告に遭遇しました。
mysqldump: [Warning] Using a password on the command line interface can be insecure.
警告なのでバックアップは取得できたようですが、警告を解消する方法がわかりません。
ということで、mysqldumpで「 [Warning] Using a password on the command line interface can be insecure.」という警告が表示される場合の対処について紹介します。
2.原因
原因は、パスワードを入れてmysqlコマンドやmysqldumpを実行すると、この警告が表示されるようです。
3.対処方法
ここではパスワードを別ファイルにしてコマンドラインにパスワードを入力しない方法を紹介します。
まず、下記の内容を、任意のディレクトリ・任意のファイル名で作成します。ここでは"test.conf"とします。実際には".test.conf"など、ピリオドつきのファイル名がいいと思います。
[client]
password = <パスワード>
ファイルのパーミッションを変更します(後で実施でもOK)。
$ chmod 400 test.conf
パーミッションのライト権を外しておかないと、コマンド実行時に下記のエラーが発生するケースがあるようです。
Warning: World-writable config file '/home/foo/test.conf' is ignored
ファイルを作成したら、下記のコマンドラインを実行します。これで警告が表示されなくなると思います。
$ mysqldump --defaults-extra-file=test.conf -h mysqlxxx.db.sakura.ne.jp -u hoge -phuga testdatabase > testdatabase.sql
コマンドラインの解説ですが、"--defaults-extra-file"オプションで、作成したファイルを読み込んでいます。
配置したディレクトリ以外でコマンドを実行する場合は、下記のように相対パスまたは絶対パスを指定してください。
$ mysqldump --defaults-extra-file=/home/foo/test.conf -h mysqlxxx.db.sakura.ne.jp -u hoge -phuga testdatabase > testdatabase.sql
なお、"--defaults-extra-file"オプションはコマンドの第1パラメータに必ず指定してください。
第2パラメータ以降で指定すると次のエラーになります。
mysqldump: [ERROR] unknown variable 'defaults-extra-file=test.conf'
私はこれでひっかかって随分悩みました(笑)。