Bash: 대화형 원격 프롬프트

Bash: 대화형 원격 프롬프트

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

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가 내 답변을 대화식으로 읽을 수 없다는 것입니다.

사용자에게 메시지를 표시하는 기능을 잃지 않고 로컬 스크립트를 원격으로 실행할 수 있는 방법이 있습니까?

답변1

다음과 같이 시도해 보세요.

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

-ttty 할당을 강제하고 , 전체 파일을 읽고, 이 경우 내용을 원격 사용자의 쉘에 의해 실행될 $(<your_script)인수로 전달합니다 .ssh

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

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

나에게는 효과가 있지만 보편적인지는 확실하지 않습니다.

답변2

문제는 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

답변3

여기 좋은 게 있어요설명하다.

그래서 대본을 다음과 같이 조정했습니다.

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

그러나 이것은 작동하지 않습니다.

그래서 SSH를 통한 로컬 리디렉션을 피하기 위해 스크립트를 원격으로 옮겼습니다. (내 명령은 다음과 같은 파일에 있습니다.에프)

cat f | ssh [email protected] '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 [email protected] "bash remf_${REMID} ; rm -v remf_${REMID}"

답변4

나는 과거에 이 문제에 대한 해결책을 여러 번 찾았지만 완전히 만족스러운 해결책을 찾지 못했습니다. 파이프를 통해 SSH에 연결하면 상호작용이 손실됩니다. 두 연결(scp/ssh)은 속도가 느리고 임시 파일이 여기저기에 흩어져 있을 수 있습니다. 명령줄의 전체 스크립트는 일반적으로 지옥을 탈출하게 됩니다.

최근에 저는 종종 매우 큰 명령줄 버퍼 크기를 발견했습니다(제가 본 "getconf ARG_MAX > 2MB"). 이로 인해 나는 그것을 사용하고 탈출 문제를 완화하는 방법에 대해 생각하게 되었습니다.

결과 :

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

또는 여기에서 설명서와 고양이를 사용하십시오.

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

나는 이 아이디어를 확장하여 완벽하게 작동하는 BASH 예제 스크립트를 생성했습니다.sshxBASH뿐만 아니라 모든 스크립트는 ssh를 통해 실행될 수 있으며 매개변수는 로컬 입력 파일일 수도 있습니다. 바라보다여기.

관련 정보