/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")
그것은 아주 잘 작동합니다.