ローカルファイルとリモートファイル間で複数のdiffを実行する

ローカルファイルとリモートファイル間で複数のdiffを実行する

複数のローカルファイルをリモートホスト上の対応するファイルと比較したいので、次のスクリプトを作成したいと思います。

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

関連情報