ssh가 중단되다
이 bash 코드를 사용하여 리모트서버에 파일을 업로드 합니다.일반 파일에서는 정상적으로 동작합니다.
for i in `find devel/ -newer $UPLOAD_FILE`
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
유일한 문제는 이름에 공백이 있는 파일의 경우 for-loop이 실패하기 때문에 첫 번째 줄을 다음과 같이 교체했습니다.
find devel/ -newer $UPLOAD_FILE | while read i
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
어떤 이상한 이유로 ssh 명령어가 while-loop에서 벗어나기 때문에 첫 번째 누락된 디렉토리는 정상적으로 작성되지만 이후의 모든 누락된 파일/디렉토리는 무시됩니다.
이것은 ssh가 stdout에 "read" 명령어를 혼동하는 무언가를 쓰는 것과 관련이 있는 것 같습니다.ssh-command를 코멘트 아웃하면 루프가 정상적으로 동작합니다.
왜 이런 일이 일어나는지, 그리고 어떻게 하면 ssh가 while-loop을 파괴하는 것을 막을 수 있는지 아는 사람이 있나요?
문제는 말이다ssh표준 입력에서 읽기 때문에 나머지 행이 모두 사용됩니다.표준 입력을 아무 데도 연결할 수 없습니다.
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i" < /dev/null
를 사용할 수도 있습니다.ssh -n리다이렉트 대신.
또 다른 접근방식은 stdin 이외의 FD를 루프하는 것입니다.
while IFS= read -u 3 -r -d '' filename; do
if [[ -d $filename ]]; then
printf -v cmd_str 'cd %q; mkdir -p %q' "$REMOTE_PATH" "$filename"
ssh "$USER@$SERVER" "$cmd_str"
else
printf -v remote_path_str '%q@%q:%q/%q' "$USER" "$SERVER" "$REMOTE_PATH" "$filename"
scp -Cp "$filename" "$remote_path_str"
fi
done 3< <(find devel/ -newer "$UPLOAD_FILE" -print0)
그-u 3그리고.3<여기서 연산자는 기본 FD 0(stdin)이 아닌 FD 3을 사용하는 것이 중요합니다.
여기에 제시된 접근법 ---print0, 클리어 완료IFS값 등 - 또한 원래 코드나 기존 응답보다 버그가 적어 흥미로운 파일명을 올바르게 처리할 수 없습니다.(글렌 잭맨의 답변은 가깝지만, 그마저도 줄바꿈이 있는 파일명이나 후행 공백이 있는 파일명은 처리할 수 없습니다.)
의 사용printf %q리모트 머신을 공격하는 데 사용할 수 없는 명령어를 생성하는 데 중요합니다.파일 이름에서 어떤 일이 일어날지 고려합니다.devel/$(rm -rf /)/hello피해망상증이 없는 코드와 함께요
언급URL : https://stackoverflow.com/questions/9393038/ssh-breaks-out-of-while-loop-in-bash
'programing' 카테고리의 다른 글
| 파일 대화상자 열기 MVVM (0) | 2023.04.21 |
|---|---|
| 어떻게 하면 stderr를 파이프에 연결할 수 있고 stdout이 아닐 수 있습니까? (0) | 2023.04.21 |
| 이동에서 한 줄씩 파일 읽기 (0) | 2023.04.21 |
| Windows 명령줄에 빈 파일을 만들려면 어떻게 해야 합니까? (0) | 2023.04.21 |
| ASP.NET CLR이 활성화되지 않음 (0) | 2023.04.16 |