
상황
- h1, h2 및 h3은 동일한 Active Directory 도메인에 연결된 세 개의 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
캐싱으로 인해 동일한 파일을 반복해서 읽는 속도가 빨라질 수 있습니다.