상황

상황

상황

  • 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를 만듭니다.

내 불완전한 솔루션

다음 스크립트를 생각해 냈지만 몇 가지 문제가 있습니다. ""그리고 $사라집니다.

  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

캐싱으로 인해 동일한 파일을 반복해서 읽는 속도가 빨라질 수 있습니다.

관련 정보