![SSH를 통해 원격으로 실행된 명령의 출력을 변수에 저장하면 차단됩니다. 연결이 종료되지 않았나요?](https://linux55.com/image/75233/SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EC%9B%90%EA%B2%A9%EC%9C%BC%EB%A1%9C%20%EC%8B%A4%ED%96%89%EB%90%9C%20%EB%AA%85%EB%A0%B9%EC%9D%98%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%B3%80%EC%88%98%EC%97%90%20%EC%A0%80%EC%9E%A5%ED%95%98%EB%A9%B4%20%EC%B0%A8%EB%8B%A8%EB%90%A9%EB%8B%88%EB%8B%A4.%20%EC%97%B0%EA%B2%B0%EC%9D%B4%20%EC%A2%85%EB%A3%8C%EB%90%98%EC%A7%80%20%EC%95%8A%EC%95%98%EB%82%98%EC%9A%94%3F.png)
문제가 무엇인지 잘 모르겠습니다. 현재 새로 설치된 Kali Linux 2.0을 사용하고 있습니다. 다음은 Ubuntu 14.04에서 작동했지만 더 이상 작동하지 않습니다(실수로 변경했을 수도 있습니까?). 나에게는 올바른 것처럼 보이지만 실행될 때마다 차단됩니다.
backup_folder=$(ssh -i /home/dexter/.ssh/id_rsa $server 'ls -t '$dir' | head -1')
이것은 더 큰 스크립트의 일부입니다. $server 및 $dir이 설정되었습니다. 명령을 단독으로 실행하면 올바른 출력이 나오지만 연결이 종료되지는 않습니다.
답변1
명령이 중단되는 이유를 완전히 확신할 수는 없지만 서버에서 전체 파이프라인을 실행할 필요는 없습니다. 거기에서 하면 충분합니다 ls
.
backup_folder=$( ssh -i keyfile "$server" "ls -t -- '$dir'" | head -n 1 )
이는 $dir
원격 측의 값을 나타냅니다(여전히 로컬로 확장됨). 이 작업은 head
로컬에서 실행됩니다.
이는 또한 "에 대한 답변에 언급된 경고와 함께 제공됩니다.왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?".
답변2
나도 같은 문제가 있었고 man ssh 를 참조하여 다음을 발견했습니다.
# Problem: if you copy & paste those two lines together into a shell,
# then the second command is not executed.
# But if you run each line on its own, it will work
srcdirs=$(ssh myserver "ls -1 /home")
echo "$srcdirs" # command is also not recorded by history
# Solution: Redirect stdin from /dev/null
srcdirs=$(ssh -n myserver "ls -1 /home")
echo "$srcdirs"
이것이 귀하의 문제를 해결하기를 바랍니다...
답변3
최근에 같은 문제가 발생했습니다. 아마도 다음과 같이 명령 끝에 stdout에 대한 리디렉션을 추가해야 할 것입니다.
backup_folder=$(ssh -i /home/dexter/.ssh/id_rsa $server 'ls -t '$dir' | head -1' 2>&1)