sshでコマンドのリモート実行がうまくいかなかった時の調査
下記の記事
MySQL-MHAを利用してMySQLの自動フェイルオーバーを実現…してみたかった
で、
ssh 192.168.44.138 "mysqlbinlog --version"
まずはホスト上で直接確認
192.168.44.138の環境にmysqlbinlogは入っていました。
しかし、他のマシンからsshでコマンドを実行してみると
[root@192.168.44.140 ~]# ssh 192.168.44.138 "mysqlbinlog --version"
bash: mysqlbinlog: command not found
が帰ってきていました。
192.168.44.138でPATH情報を確認すると
[root@192.168.44.138 ~]# printenv PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
となっており/usr/local/mysql/binにパスが通っていますが、
他のマシンからパスを確認すると
[root@192.168.44.140 ~]# ssh 192.168.44.138 "printenv PATH"
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
となっており、.bash_profileで指定した/usr/local/mysql/binが通っていない状態でした。
各サーバのMySQLはyumではなくバイナリファイルを展開してインストールしたので、PATHの情報を~/.bash_profileに記述していました。
この状況を回避する為に二つの方法を試しました。
/usr/local/binにシンボリックリンクを張る方法
リモート実行の場合でも/usr/local/binにはパスが通っているので、mysql,mysqlbinlogコマンドを/usr/local/bin以下にシンボリックリンクを張ります。
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
[root@192.168.44.140 ~]# ssh 192.168.44.138 "mysqlbinlog --version"
mysqlbinlog Ver 3.3 for linux2.6 at x86_64
バージョン情報が帰ってきました。
sshで環境変数の変更を許可する方法
sshd_configのPermitUserEnvironmentをyesにします。
PermitUserEnvironmentはユーザの環境変数変更を許可する設定です。~/.ssh/environmentファイルおよび~/.ssh/authorized_keysにおけるenvironment=オプションを処理すべきかどうかを指定します。デフォルトは"no"になっています。
ただ、全ユーザに適用されるのでセキュリティリスクが上がる可能性があります。
~/.ssh/environmentを作成して、指定したいPATHをフルパスで書きます。($PATHなどで変数は展開されないのでフルパスで書く必要があります)
vim ~/.ssh/environment
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
sshdを再起動します。
/etc/init.d/sshd restart
[root@192.168.44.140 ~]# ssh 192.168.44.138 "mysqlbinlog --version"
mysqlbinlog Ver 3.3 for linux2.6 at x86_64
バージョン情報が帰ってきました。
[root@192.168.44.140 ~]# ssh 192.168.44.138 "printenv PATH"
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
PATHにも/usr/local/mysql/binが含まれています。
これで作業が再開できます。