単一のSSHセッションでssh、cat、およびdiffのみを使用してファイルをアップロードし、ファイルを調べて他のコマンドを実行するにはどうすればよいですか?

単一のSSHセッションでssh、cat、およびdiffのみを使用してファイルをアップロードし、ファイルを調べて他のコマンドを実行するにはどうすればよいですか?

目標は、IP、パラメータ、およびパラメータ形式のCSVに基づいて、信頼できない(無線)接続を使用する多くのデバイスのいくつかのパラメータに基づいて変更することです。

ファイルをアップロードし、ローカルコピーと比較してファイルの内容を確認し、bash、ssh、cat、diffのみを使用してリモート側で別のコマンドを実行するbashスクリプトを作成したいと思います。リモートLinuxサーバー(Busybox)には基本的なツールしか使用できず、何千ものものがあるため、拡張が重要です。私はこれらすべてを単一のSSHセッションで実行したいと思います。ここで認証は一度だけ行うことができます。今は安全が問題ではないふりをしています。 RSA公開鍵配布をすべての項目に拡張する方法を調査していますが、今はパスワード認証を使用して機能したいと思います。これを安全慣行に関する冗談に変えないでください。たぶん上記の目標を達成するより簡単な方法があるかもしれません。その場合は共有してください。ありがとうございます。

したがって、ステップは次のようになります。

  1. リモートボックスにログインします。
  2. ローカルファイルをリモートボックスの特定のディレクトリにコピーします。
  3. diff またはいくつかのタイプのファイルコピーエラーチェックを実行します。
  4. エラーがある場合はスクリプトを停止し、それ以外の場合は続行します。
  5. リモートボックスから別のコマンドを実行します。
  6. コマンド結果をローカルファイルに出力します。
  7. セッションを閉じます。
  8. すすぎ、繰り返します。

以下は一種の疑似コードです。しかし、それは私が何をしたいのかについてのアイデアを提供します。 diffはローカルファイルリストを作成する出力を見ることができないので、ファイルが異なると思います。

IFS=\,
while read IP PARAM1 PARAM2; do
    
cat /home/user/uploadscript.sh | sshpass -p $password ssh -v -o StrictHostKeyChecking=no -l uname 192.168.x.x 'cat > /tmp/script.sh && cat | diff -sb - /tmp/script.sh && IP="IP" && P1="$PARAM1" && P2="$PARAM2" && ./script.sh'
    
done < list_of_ipaddresses.txt >> log.txt

答え1

たぶん、次のようなものがあります。

{
  sha1sum /dev/fd/3 3< file-to-transfer &&
    cat file-to-transfer
} | ssh host '
  read sum &&
    cat > transferred-file &&
    echo "$sum" | sha1sum --quiet -c 3< transferred-file || exit
  cmd-that-expect-a-properly-transmitted-file'

(ターゲットユーザーのログインシェルがhostBourneに似ていると仮定)

これはssh転送の整合性を保証しますが、チェックサムチェックには中断された転送とターゲットの潜在的な障害のあるストレージデバイスが含まれます(データがキャッシュされる可能性があります)。後者でない場合は、寸法を確認するだけで十分です。

答え2

必要な唯一のコマンドは、scp他のコマンドと同様に、scp成功の場合はステータスコード0を返し、エラーの場合はゼロ以外の値を返します。 0が返されると、scpファイルのアップロードは成功しました。

if scp …; then
  echo >&2 "The file was uploaded successfully."
else
  echo >&2 "There was an error uploading the file."
fi

答え3

この場合、私が正確に覚えている場合は、上記のControlMasterの使用に関する説明に答えがあります。 @Jakuje ありがとうございます!

関連情報