원격 데스크톱에 SSH로 연결하여 일부 작업을 수행할 수 있게 해주는 이 기능이 있지만 실제로 구문과 이 작업이 가능한지 여부를 파악할 수 없습니다.
#Simple example
simple () {
ssh $1 "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/$2; mkdir $var; cd $var; pwd";
}
위 스크립트를 실행하면 오류가 발생합니다.missing operand Try 'mkdir --help' for more information. /home/ubuntu
내가 하고 싶은 일은 원격 데스크톱에 연결하고, 새 디렉터리를 만들고 /home/ubuntu/$2
, 거기에 CD를 넣고 인쇄하는 것입니다.
PS 죄송합니다. 또 다른 위치 토론이 있을 것이라는 점을 언급하는 것을 깜빡했습니다.
답변1
전체 문자열은 "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd"
원격 호스트로 전송되기 전에 클라이언트 측에서 확장됩니다. 클라이언트 환경에서는 var
이것이 설정되지 않아 $var
빈 문자열로 확장되고, 결과적으로 원격 호스트에서 실행되는 명령은 인수 mkdir
없이 실행됩니다 cd
.
간단한 수정 방법은 문자열을 작은따옴표로 묶어서 원격 호스트에서 강제로 확장하는 것입니다.
ssh "$1" 'cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd'
실제 사용 사례에서 문자열의 일부를 클라이언트 측에서 확장해야 하는 경우 큰따옴표를 사용하고 원격으로 확장해야 하는 변수만 보호할 수 있습니다.
ssh "$1" "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir \$var; cd \$var; pwd"
이를 수행하는 다른 방법도 있습니다. 여기에 있는 다양한 문서 스타일 중 하나가 적합할 수도 있습니다.
답변2
또 다른 방법은 heredoc를 사용하는 것입니다(수퍼유저 질문에 대한 답변에 포함됨).
simple.func () {
ssh ${1}@${2} <<'EOF'
cd /home/jbutryn/test
DIR_VAR='/home/jbutryn/test/tmp'
mkdir "$DIR_VAR"
cd "$DIR_VAR"
pwd
EOF
}
dhag가 지적한 대로 로컬 시스템의 모든 변수를 이스케이프 처리해야 원격 시스템에 있는 그대로 전송되어 그곳에서 확장됩니다. 작은따옴표 EOF
구분 기호가 이를 수행합니다. $2
호스트 이름/IP에 대한 매개변수 도 추가했습니다 . 어떻게 함수를 실행했는지 잘 모르겠지만 지금은simple.func [user] [hostname]
로컬 위치 매개변수를 전달해야 하므로 다음과 같이 할 수 있습니다.
simple.func () {
ssh ${1} <<EOF
cd /home/jbutryn/test
DIR_VAR="/home/jbutryn/test/${2}"
mkdir '$DIR_VAR'
cd '$DIR_VAR'
pwd
EOF
}