배쉬 : 대화식 원격 프롬프트 ] ; then

원격 서버에 연결하고 일부 패키지가 설치되어 있는지 확인하는 스크립트가 있습니다.

ssh root@server 'bash -s' < myscript.sh

myscript.sh :

OUT=`rpm -qa | grep ntpdate`
if [ "$OUT" != "" ] ; then
    echo "ntpdate already installed"
else
    yum install $1
fi

이 예제는 단순화 될 수 있습니다. 다음은 myscript2.sh동일한 문제가 있습니다.

read -p "Package is not installed. Do you want to install it (y/n)?" choise

내 문제는 bash가 대화 형으로 내 대답을 읽을 수 없다는 것입니다.

사용자에게 프롬프트하지 않고 로컬 스크립트를 원격으로 실행할 수있는 방법이 있습니까?



답변

다음과 같이 해보십시오 :

$ ssh -t yourserver "$(<your_script)"

-t힘 청각 장애 할당, $(<your_script)전체 파일을 읽고,이 경우 하나 개의 인수로 콘텐츠를 전달 ssh원격 사용자의 쉘에 의해 실행됩니다.

스크립트에 매개 변수가 필요한 경우 스크립트 뒤에 매개 변수를 전달하십시오.

$ ssh -t yourserver "$(<your_script)" arg1 arg2 ...

그것이 보편적인지 아닌지는 확실하지 않습니다.


답변

문제는 ssh원격 시스템에서 비 대화식 로그인 을 시작하는 것입니다. 명백한 쉬운 해결책은 스크립트를 원격 서버에 복사하여 거기서 실행하는 것입니다.

scp myscript.sh root@server:/tmp && ssh root@server /tmp/myscript.sh

어떤 이유로 든 복사가 옵션이 아닌 경우 스크립트를 수정하여 먼저 연결하고 $1설치되어 있는지 확인한 다음 필요에 따라 다시 연결하고 설치하십시오.

OUT=$(ssh root@server rpm -qa | grep "$1");
if [ "$OUT" != "" ] ; then
    echo "$1 already installed"
else
   read -p "Package $1 is not installed. Do you want to install it (y/n)?" choice
   if [ "$choice" -eq "y" ]; then
       ssh root@server yum install "$1"
   fi
fi


답변

여기 좋은 설명이 있습니다.

그래서 나는 스크립트를

hostname
echo -n "Make your choice :"
read choice
echo "You typed " ${choice}
echo done

그리고 이것은 작동하지 않았습니다.

그래서 ssh의 로컬 리디렉션을 피하기 위해 스크립트를 원격으로 옮겼습니다. (내 명령은 f 라는 파일에 있습니다. )

cat f | ssh user@remotehost.com 'cat >remf'
ssh user@remotehost bash remf

이것은 효과가 있었다. 출력은 다음과 같습니다.

christian@clafujiu:~/tmp$ ssh localhost bash tmp/f
christian@localhost's password:
Linux clafujiu 2.6.32-52-generic #114-Ubuntu SMP Wed Sep 11 19:00:15 UTC 2013 i686 GNU/Linux
Sun Nov 10 14:58:56 GMT 2013
Make your choice :abc
You typed  abc
done

@terdon은 원래의 강렬이 로컬 스크립트를 원격으로 실행하는 것이라고 언급 했으므로 원격 사본을 자동화 할 수 있습니다.

REMID=`cat f |ssh user@remotehost 'cat > remf_$$; echo $$'` ;ssh root@redtoadservices.com "bash remf_${REMID} ; rm -v remf_${REMID}"


답변

과거 에이 문제에 대한 솔루션을 여러 번 검색했지만 완전히 만족스러운 솔루션을 찾지 못했습니다. ssh에 파이핑하면 대화 형 작업이 느슨해집니다. 두 개의 연결 (scp / ssh)이 느리고 임시 파일이 남아있을 수 있습니다. 그리고 명령 행의 전체 스크립트는 종종 지옥에서 빠져 나옵니다.

최근에 커맨드 라인 버퍼 크기가 일반적으로 매우 크다는 것을 알게되었습니다 ( ‘getconf ARG_MAX> 2MB). 그리고 이것이 어떻게 이것을 사용하고 탈출 문제를 완화시킬 수 있는지 생각하게했습니다.

결과는 다음과 같습니다.

ssh -t <host> /bin/bash "<(echo "$(cat my_script | base64 | tr -d '\n')" | base64 --decode)" <arg1> ...

또는 here 문서와 고양이를 사용하십시오.

ssh -t <host> /bin/bash $'<(cat<<_ | base64 --decode\n'$(cat my_script | base64)$'\n_\n)' <arg1> ...

이 아이디어를 확장하여 sshx인수가 ssh를 통해 로컬 입력 파일이 될 수있는 BASH뿐만 아니라 임의의 스크립트를 실행할 수 있는 완전히 작동하는 BASH 예제 스크립트를 생성했습니다 . 여기를 참조 하십시오 .


답변