複数のローカルファイルをリモートホスト上の対応するファイルと比較したいので、次のスクリプトを作成したいと思います。
ssh user@remote_host "cat remote_file1.txt" | diff - local_file1.txt
ssh user@remote_host "cat remote_file2.txt" | diff - local_file2.txt
...
ssh user@remote_host "cat remote_fileN.txt" | diff - local_fileN.txt
このタイプのスクリプトの問題は、各ファイルのパスワードを要求することです。パスワードを一度だけ尋ねるようにするにはどうすればよいですか?
答え1
1 つの方法は、パスワードのないアクセス (公開鍵認証) を設定すること、もう 1 つは接続を再利用することです。~/.ssh/config
次の内容で構成ファイルを作成します。
Host remote_host
User user
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist 5m
ディレクトリを作成します~/.ssh/controlmasters/
。
mkdir -m 700 ~/.ssh/controlmasters/
その後、スクリプトを実行するときにパスワードを一度だけ要求する必要があり、他のすべてのコマンドはすでに認証されているのと同じ接続で実行されます。
答え2
次のコマンドを使用してパスワードのないアクセスを生成できない場合は、ssh-keygen user@remotehost
汎用expect
ツールをインストールして次のスクリプトを生成できますpassexpect
。
#!/usr/bin/expect -f
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
log_user 0
eval spawn $cmd
expect "assword:"
send "$password\r";
interact
その後、デフォルトのシェルスクリプトからパスワードを一度読むことができます。
printf "ssh password:" >&2; read -s pass; printf "\n">&2
SSH コマンドで使用します。
passexpect $pass ssh user@remotehost command_for_remote_host
またはあなたの目的に応じて、スクリプト全体は次のようになります。
#/usr/bin/env bash
printf "ssh password:" >&2; read -s pass; printf "\n">&2
./passexpect $pass ssh user@remotehost cat remoteF1.txt | diff - localF1.txt
./passexpect $pass ssh user@remotehost cat remoteF2.txt | diff - localF2.txt