![SSH를 사용하여 원격 명령을 실행하면 "bash:/dev/fd/63: 해당 파일 또는 디렉터리가 없습니다."가 표시됩니다.](https://linux55.com/image/79763/SSH%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9B%90%EA%B2%A9%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EB%A9%B4%20%22bash%3A%2Fdev%2Ffd%2F63%3A%20%ED%95%B4%EB%8B%B9%20%ED%8C%8C%EC%9D%BC%20%EB%98%90%EB%8A%94%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EA%B0%80%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.%22%EA%B0%80%20%ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4..png)
/root/test.sh
원격 서버에 다음이 있습니다 .
#!/bin/bash
date
원격 서버에서 다음과 같은 출력을 얻습니다.
# ./test.sh
Fri Dec 18 07:41:10 EST 2015
# bash <(cat /root/test.sh)
Fri Dec 18 07:41:23 EST 2015
그러나 로컬 컴퓨터에서 동일한 명령을 실행하려고 하면 다음과 같은 결과가 나타납니다.
$ ssh root@remote_server /root/test.sh
Fri Dec 18 07:44:32 EST 2015
$ ssh root@remote_server bash <(cat /root/test.sh)
cat: /root/test.sh: No such file or directory
bash: /dev/fd/63: No such file or directory
그렇다면 지난번에 실행했을 때 문제는 무엇이었나요? 이와 같은 스크립트를 실행하는 것이 이상하다고 생각할 수도 있습니다 bash <(cat /root/test.sh)
. 내가 이렇게 하는 이유는 그것이 내 현실의 단순화된 버전이기 때문입니다. 내 실제 코드는 인터넷에서 다운로드하여 로컬로 실행하는 Bash 스크립트입니다. 다양한 매개변수를 사용하여 실행할 컴퓨터가 많기 때문에 로컬 컴퓨터에서 실행하려고 합니다.
답변1
이 방법으로 파일 설명자를 전달할 수 없습니다 ssh
. <(...)
이 구성은 시스템에 더미 파일을 생성하며 원격 시스템에서 실행될 때 의미가 없습니다.
정말로 사용하고 싶다면 따옴표로 묶고 bash가 있으면 원격 시스템에서 평가됩니다.
ssh root@remote_host "bash <( cat /root/test.sh )"
답변2
내 제안은 원격 호스트에서 스크립트를 실행하고( /root/test.sh
) 실행 가능하게 만들고( chmod u+x /root/test.sh
) 다음과 같이 실행하는 것입니다.
ssh root@remote_server /bin/bash -c /root/test.sh
/bin/bash: /dev/fd/63: No such file or directory
이 답변을 읽을 수 있는 이유에 대해
[1] .
참고: 불필요한 보안 위험을 피하기 위해 명령 이름( ) 대신
전체 경로( )를 사용하는 것이 좋습니다 ./bin/bash
bash
2] .
또 다른 방법은
ssh root@remote_server << EOF
cat /root/test.sh
# whatever else
EOF
두 번째 EOF까지 모든 줄을 실행합니다... 이를 변형할 수 있습니다...
답변3
최근에 같은 문제가 발생했지만 이것이 실행될 때만 발생한다는 것을 깨달았습니다.sudo/루트사용자.
내가 실행하면 :
sudo bash <(echo "It worked")
나는 얻다:
bash: /dev/fd/63: No such file or directory
하지만 내가 실행하면 :
bash <(echo "It worked")
그것은 아주 잘 작동합니다.