원격 서버에 연결하고 일부 패키지가 설치되어 있는지 확인하는 스크립트가 있습니다.
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 예제 스크립트를 생성했습니다 . 여기를 참조 하십시오 .