2012-12-18 2 views
11

SSH를 서버에 넣고 파일/폴더를 입력하라는 셸 스크립트를 작성하려고합니다. 내 쉘 스크립트가 오히려 큰 내가 모든 따옴표를 탈출 할 수 싶지 않기 때문에SSH heredoc : bash prompt

ssh $SERVER <<EOF 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo $FILEPATH 
eval FILEPATH="$FILEPATH" 

echo "Downloading $FILEPATH to $CLIENT" 
EOF 

나는이 명령을 실행하기 위해 SSH 후 큰 따옴표 대신 히어 닥을 사용하고 있습니다.

큰 따옴표를 사용할 때 프롬프트가 정상적으로 작동했습니다. 그러나 이제 heredoc을 사용하고 있으므로 프롬프트가 더 이상 작동하지 않습니다.

heredoc에서 작동하도록 프롬프트를 표시하려면 어떻게해야합니까? 그리고하지 않을 경우, 내 스크립트를 레이아웃있는 방법이 될 수 있도록 프롬프트 않습니다 따옴표로 모든 것을 감싸고과 같이, 탈출없이 일 :

ssh $SERVER " 
cd downloads/ 
read -e -p \"Enter the path to the file: \" FILEPATH 
echo $FILEPATH 
eval FILEPATH=\"$FILEPATH\" 

echo \"Downloading $FILEPATH to $CLIENT\" 
exit 
" 

답변

7

클라이언트에서 어떤 변수를 필요로하지 않는 경우, 왜 시도하지 - 그리고 ssh -t이 유용 할 수 있습니다. 에

ssh -t $SERVER ' 
# your script, unescaped. 
# if you want access to a locally defined variable, 
echo "CLIENT is '$CLIENT'." 
' 
+0

'<< 'EOF'로 변경하면 SSH 서버 내부의 bash 프롬프트로 이동합니다. 필자가 실제로 '프롬프트'를 사용한다는 것은 다음과 같습니다 :'read -e -p "파일의 경로를 입력하십시오 :"FILEPATH' - 스크립트는 사용자에게 파일을 요구해야합니다. –

+0

처음에 작은 따옴표를 사용했지만 SSH 명령 앞에 정의 된'$ CLIENT'와 같은 변수에 액세스 할 수 없습니다. –

+0

단일 인용 부호 이스케이프 해제에 대한 제안을 추가했습니다. 추한,하지만 그것이 당신을 위해 작동하는지 궁금해? – Faiz

2

이 호스트 작품에 탭 완성을 사용할 수 있습니다.

이 디렉토리를 묻는 메시지에서이 파일을 작성 광산에
var=$(cat<<EOF 
read -e -p Path pname; 
echo \$pname; 
hostname; 
echo \$pname; 
cd \$pname; 
pwd; 
touch THIS ; 
exit; 
EOF 
) 

ssh -t NODE $var 

.

+0

프롬프트에서 나는 다음을 의미합니다 :'read -e -p \ "파일의 경로를 입력하십시오 : \"FILEPATH' –

+0

업데이트 된 버전을 사용해보십시오. 이것은 프롬프트와 함께 작동합니다. – kdubs

+0

하지만 읽기 프롬프트가 로컬로 실행되었지만 올바르지 않습니다. – dogbane

1

이 하나가 작동하는 것 같다 :

T=$(tty) ; bash <<XXX 
echo Hi "$T" 
read p <$T 
echo p: \$p 
echo Bye 
XXX 
+0

어떻게 그 모양의 SSH 동등한 것입니까? –

0

: 다음이 작업을 수행 UST 수, 따옴표와 함께 유일한 문제는 탈출하고, 당신이 당신의 스크립트에서 ' 작은 따옴표를 사용하여 계획이없는 경우 있음을

export CLIENT=me 

CMDS=$(cat <<CMD 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo \$FILEPATH 
eval FILEPATH="\$FILEPATH" 

echo "Downloading \$FILEPATH to $CLIENT" 
CMD 
) 

ssh localhost -t "$CMDS" 

주 heredoc과 함께 작동하게하려면 bash 또는 원격 서버에서 사용하려는 모든 쉘을 호출하기에 충분해야합니다. 당신은 아마 현재 로컬 쉘이 아닌 원격 쉘에 의해 보간 될 것 때문에, FILEPATH$을 탈출하려는

ssh $SERVER bash <<EOF 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo $FILEPATH 
eval FILEPATH="$FILEPATH" 

echo "Downloading $FILEPATH to $CLIENT" 
EOF 

참고 : 너무처럼.

관련 문제