状況

状況

状況

  • h1、h2、およびh3は、同じActive Directoryドメインに接続された3つのLinuxホストです。
  • アカウントAとBはどちらもADアカウントです。
  • Bはパスワードなし(Kerberos認証が設定されています)、すべてのホストにSSHで接続でき、sudoer各ホストでsudoをAとして使用できます(すべてのコマンドがパスワードなしで実行できるように設定されています)。
  • A は SSH 経由でこれらのホストに直接接続できません。
  • /local/path/すべてのホストに存在
  • f1とf2は/local/path/h1の下に作成され、このファイルはAからのみ読み取ることができます。
  • これらのファイルには、複数行、二重引用符、$を含めることができます。

ターゲット

  • 同じ内容でh2とh3にf1とf2を作成します。

私の不完全な解決策

次のスクリプトを考えましたが、いくつかの問題があります。""そして$消えます。

  1. 私のスクリプトが期待どおりに機能するのに役立ちますか?
  2. 私の目標を達成するためのより良い方法はありますか?
# src and dest should actually be the same (but on different hosts)
# Since we are doing the test on localhost, they are set to different directories (only accessible by testuser, i.e. account A)
SRC_DIR=/home/testuser
DEST_DIR=/var/tmp/testuser


# For demo purpose. In reality, it should be an array of hosts, i.e. h2, h3
HOSTS=(localhost)
FILES=(f1 f2)
declare -A FILE_TO_CONTENT=([f1]="`sudo -i -u testuser cat /home/testuser/f1`" [f2]="`sudo -i -u testuser cat /home/testuser/f2`")

for h in ${HOSTS[@]}
do
  for f in ${FILES[@]}
  do
    file_content=${FILE_TO_CONTENT[$f]}
    echo "$file_content"  # The output looks normal
    ssh $h "echo \"${file_content}\" | sudo -i -u testuser tee $DEST_DIR/$f "  # Double quotes are removed, $dollar disappears
    echo ""  # Separate output for different files
  done
done

内容f1f2

# f1
f1-line 1
f1-line 2
f1-line 3 with "double quote"
f1-line 4 with 'single quote'
f1-line 5 with special char: #hash, $dollar

# f2
f2-line 1
f2-line 2

スクリプトを実行した後の出力(下の出力ファイルにもおよび/var/tmp/testuserがない)""$

f1-line 1
f1-line 2
f1-line 3 with "double quote"
f1-line 4 with 'single quote'
f1-line 5 with special char: #hash, $dollar
f1-line 1
f1-line 2
f1-line 3 with double quote
f1-line 4 with 'single quote'
f1-line 5 with special char: #hash, 

f2-line 1
f2-line 2
f2-line 1
f2-line 2

答え1

私はファイルの内容を変数に入れません。

ループではできます

sudo -u testuser cat "SRC_DIR/$f" | ssh "$h" sudo -u testuser tee "$DEST_DIR/$f"
# src and dest should actually be the same (but on different hosts)
# Since we are doing the test on localhost, they are set to different directories (only accessible by testuser, i.e. account A)
SRC_DIR=/home/testuser
DEST_DIR=/var/tmp/testuser


# For demo purpose. In reality, it should be an array of hosts, i.e. h2, h3
HOSTS=(localhost)
FILES=(f1 f2)

for h in "${HOSTS[@]}"
do
  for f in "${FILES[@]}"
  do
    sudo -u testuser cat "SRC_DIR/$f" | ssh "$h" sudo -u testuser tee "$DEST_DIR/$f"
    echo ""  # Separate output for different files
  done
done

または、tarホストでのみGNUとループを使用してください。

sudo -u testuser tar -C "$SRC_DIR" c "${FILES[@]}" | ssh "$h" sudo -u testuser tar -C "$DEST_DIR" x
# src and dest should actually be the same (but on different hosts)
# Since we are doing the test on localhost, they are set to different directories (only accessible by testuser, i.e. account A)
SRC_DIR=/home/testuser
DEST_DIR=/var/tmp/testuser


# For demo purpose. In reality, it should be an array of hosts, i.e. h2, h3
HOSTS=(localhost)
FILES=(f1 f2)

for h in "${HOSTS[@]}"
do
  sudo -u testuser tar -C "$SRC_DIR" c "${FILES[@]}" | ssh "$h" sudo -u testuser tar -C "$DEST_DIR" x
done

キャッシュにより、同じファイルを繰り返し読み込む速度が速くなることがあります。

関連情報