Linux で SSH 経由でコマンドを実行する
Linux で SSH 経由でコマンドを実行する
以下の記事では ubuntu 21.10 を使用しています。
説明で使用する構成
クライアント側
マシン名: test1
IPアドレス: 192.168.11.21
ユーザー: user1
サーバー側
マシン名: test2
IPアドレス: 192.168.11.22
ユーザー: user2
パスワード: password2
準備作業
クライアント側
パスワード入力を自動化したいので sshpass
をインストールしておく。
sudo apt install -y sshpass
サーバー側
sudo apt install -y openssh-server
sudo systemctl start ssh
sudo systemctl enable ssh
手順
ユーザー権限の操作の場合
sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 ls
sudo 権限が必要な操作の場合
sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 "echo password2 | sudo -S dmesg"
解説
一番シンプルな構成
SSH でリモートマシンに接続して任意のコマンド(以下の場合 ls) を実行する場合以下のようにします。
ssh user2@192.168.11.22 ls
しかし以下のようにパスワードの確認を求められてかつ、fingerprint の確認が行われます。
これだと自動化できないのでこの二つを自動化したい。
user1@test1:~$ ssh user2@192.168.11.22 ls
The authenticity of host '192.168.11.22 (192.168.11.22)' can't be established.
ECDSA key fingerprint is SHA256:*************************.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.11.22' (ECDSA) to the list of known hosts.
user2@192.168.11.22's password:
ダウンロード
テンプレート
デスクトップ
ドキュメント
ビデオ
ピクチャ
ミュージック
公開
fingerprint の確認をさせないようにする
StrictHostKeyChecking
のオプションを no にすることにより、確認をさせないようにします。
また UserKnownHostsFile
で /dev/null
を指定することにより、knownhostファイルが空の状態で実施することにより接続先の情報が変わってもエラーとならないようにします。(これにはセキュリティ上のリスクがあるので、安全といえる場合だけに限定する必要があります。)
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 ls
ser1@test1:~$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 ls
Warning: Permanently added '192.168.11.22' (ECDSA) to the list of known hosts.
user2@192.168.11.22's password:
ダウンロード
テンプレート
デスクトップ
ドキュメント
ビデオ
ピクチャ
ミュージック
公開
パスワードの自動入力
パスワード入力を自動化するために sshpass
を導入します。
クライアント側に sshpass をインストールします。
sudo apt install -y sshpass
sshpass を使ってパスワード入力を自動化します。(これにもセキュリティ上の懸念があります)
-p
オプションを指定してコマンドラインで パスワードを指定します。
sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 ls
サーバー側で sudo が必要な操作を実行する
サーバー側で sudo が必要な操作例えば dmesg
を実行すると以下のようにエラーとなります。
これはサーバー側で sudo を実行した際にパスワードの入力を待ってくれないことがあります。
sudo での実行が必要な操作
user1@test1:~$ sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 dmesg
Warning: Permanently added '192.168.11.22' (ECDSA) to the list of known hosts.
dmesg: カーネルバッファの読み込みに失敗しました: 許可されていない操作です
sudo で実行
user1@test1:~$ sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 sudo dmesg
Warning: Permanently added '192.168.11.22' (ECDSA) to the list of known hosts.
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: パスワードが必要です
sudo -S で実行
sudo は -S
コマンドを指定することにより標準入力からパスワードを受け取る機能があるので
echo コマンドでパスワードを出力して、それをパイプでつなぐことにより sudo にパスワードを引き渡して実行します。
sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 "echo password2 | sudo -S dmesg"
user1@test1:~$ sshpass -p password2 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user2@192.168.11.22 "echo password2 | sudo -S dmesg"
Warning: Permanently added '192.168.11.22' (ECDSA) to the list of known hosts.
[sudo] user2 のパスワード: [ 0.000000] Linux version 5.13.0-22-generic (buildd@lgw01-amd64-012) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #22-Ubuntu SMP Fri Nov 5 13:21:36 UTC 2021 (Ubuntu 5.13.0-22.22-generic 5.13.19)
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.13.0-22-generic root=UUID=7954ae94-5a21-4738-be70-942f7abeb1c3 ro quiet splash
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Hygon HygonGenuine
[ 0.000000] Centaur CentaurHauls
[ 0.000000] zhaoxin Shanghai
[ 0.000000] Disabled fast string operations
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
...
参考サイト
Discussion