FAT47の底辺インフラ議事録

学んだことのメモ帳です

sshでコマンドのリモート実行がうまくいかなかった時の調査

下記の記事

MySQL-MHAを利用してMySQLの自動フェイルオーバーを実現…してみたかった

で、


ssh 192.168.44.138 "mysqlbinlog --version"
がcommand not foundになりうまく実行できなかったので、そのときにした調査のメモです。

まずはホスト上で直接確認
192.168.44.138の環境にmysqlbinlogは入っていました。


[root@192.168.44.138 ~]# mysqlbinlog --version
mysqlbinlog Ver 3.3 for linux2.6 at x86_64

しかし、他のマシンから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が通っていない状態でした。
各サーバのMySQLyumではなくバイナリファイルを展開してインストールしたので、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にします。


/etc/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が含まれています。


これで作業が再開できます。