場合によっては、sshを使用してリモートマシンでコマンドをローカルに実行すると、繰り返しの多いタスクを簡単に処理できることがあります。私たちは達成したいと思っています:

  • 手動パスワード入力なし
  • 複数のコマンドの実行とシェルスクリプトの実行をサポート
  • sudoコマンドの実行をサポート

手動パスワード入力なし

ssh相互信頼、sshpassなどのツールを使用して、手動でパスワードを入力することを避けることができます。使用プロセスでは、yesの手動入力を必要とする次の厄介なシナリオが発生する可能性があります。

$ ssh username@hostname
The authenticity of host ... can't be established.
ECDSA key fingerprint is ...
Are you sure you want to continue connecting (yes/no)?

上記のシナリオを回避するには、sshコマンドに次のパラメーターを追加します。

$ ssh -o "StrictHostKeyChecking no" username@password

SSH相互信頼

SSH相互信頼の設定は非常に簡単です。最初にsshキーを生成します。

$ ssh-keygen

公開鍵を信頼できる当事者にコピーします。

$ ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname

次に、パスワードなしでコマンドを実行します。

$ ssh -o "StrictHostKeyChecking no" username@password cmd

sshpass

sshpass  は、非対話型のsshパスワード検証ツールであり、使用前にインストールされます。

$ yum install sshpass

次のように使用します。

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@hostname cmd

期待する

Expect  は、自動制御とテストに使用されるソフトウェアツールです。学習コストは高いですが、expectは強力であり、expectを使用するとリモートコマンドを簡単に実行できます。使用前にインストール:

$ yum install expect

たとえば、次のとおりです。

#!/usr/bin/expect

spawn ssh -o "StrictHostKeyChecking no" username@hostname
expect "*assword*"
send "password\n" expect "*$*" send "command\n" expect "*$*" send "exit\n" expect eof 

sshだけでなく、scp、ftp、その他のツールもサポートすることを期待してください。

複数のコマンドとスクリプトをサポート

複数のコマンドを実行する

sshpassとexpectは、複数のコマンドをサポートする点で非常に似ています。&&を使用してコマンドを接続します。

# ssh trust
$ ssh -o "StrictHostKeyChecking no" username@password "cmd1 && cmd2" 

たとえば、次のとおりです。

# sshpass
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password "ls -a && mkdir test" # expect ...... expect "*$*" send "ls -a && mkdir test\n" ...... 

ローカルスクリプトを実行する

ローカルスクリプトの実行には、sshとsshpassが同様に使用されます。

# ssh trust
$ ssh -o "StrictHostKeyChecking no" username@password bash -s < shell_script.sh # sshpass $ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password bash -s < shell_script.sh 

予想のために、まずスクリプトをリモートホストにコピーしてから、リモートホストでスクリプトを実行する必要があります。手順は次のとおりです。

...
# Copy script to remote host
spawn scp -o "StrictHostKeyChecking no" shell_script.sh username@hostname:~/
expect "*assword*"
send "password\n" expect "*100%*" expect eof # Execute the shell script at remote host spawn ssh -o "StrictHostKeyChecking no" username@hostname expect "*assword*" send "password\n" expect "*$*" send "sh shell_script.sh\n" ...... 

sudoコマンドの実行をサポート

一部のコマンドを実行するにはsudo権限が必要ですが、パスワードを繰り返し入力したくないので、各コマンドを次のように変更できます。

cmd ---> 'echo password | sudo -S cmd'

たとえば、次のとおりです。

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password "echo password | sudo -S mkdir /newdir" 

echoやddなどの一部のコマンドでは、次の失敗シナリオが表示されることがあります。

$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password 'echo password | sudo -S echo hello > /newdir/newfile' bash: /newdir/newfile: 权限不够 

解決策は次のとおりです。

cmd ---> 'echo password | sudo -S sh -c "cmd"'

# For example
$ sshpass -p password ssh -o "StrictHostKeyChecking no" username@password 'echo WSfdl097018= | sudo -S sh -c "echo hello > /newdir/newfile"' 

expectを使用する場合は、スクリプトをリモートホストにコピーし、sudoを使用してリモートホストでスクリプトを実行する必要があります。これは、sshpassよりも簡単で堅牢です。

...
# Copy script to remote host
spawn scp -o "StrictHostKeyChecking no" shell_script.sh username@hostname:~/
expect "*assword*"
send "password\n" expect "*100%*" expect eof # Execute the shell script at remote host spawn ssh -o "StrictHostKeyChecking no" username@hostname expect "*assword*" send "password\n" expect "*$*" send "sudo sh shell_script.sh\n" expect "*assword*" send "password\n" ......