🙌

Linux で SSH 経由でコマンドを実行する

2021/12/19に公開

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

https://qiita.com/m-tmatma/items/9a562863ca99ca6c0d1c

手順

ユーザー権限の操作の場合

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'
       ...

参考サイト

https://qiita.com/m-tmatma/items/9a562863ca99ca6c0d1c

https://qiita.com/koara-local/items/1aec16a4f866844f546d

https://siguniang.wordpress.com/2014/02/28/get-rid-of-openssh-warning-message/

Discussion