状況
- 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を作成します。
私の不完全な解決策
次のスクリプトを考えましたが、いくつかの問題があります。""
そして$
消えます。
- 私のスクリプトが期待どおりに機能するのに役立ちますか?
- 私の目標を達成するためのより良い方法はありますか?
# 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
内容f1
課f2
# 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
キャッシュにより、同じファイルを繰り返し読み込む速度が速くなることがあります。