이미 ssh 에이전트가 설정되어 있으며 Bash 스크립트의 외부 서버에서 다음과 같은 작업을 수행하여 명령을 실행할 수 있습니다.
ssh blah_server "ls; pwd;"
이제 실제로하고 싶은 것은 외부 서버에서 많은 긴 명령을 실행하는 것입니다. 인용 부호 사이에 이러한 모든 것을 포함시키는 것은 매우 추한 일이며, 이것을 피하기 위해 실제로 여러 번 ssh’ing하는 것을 피하고 싶습니다.
괄호 또는 무언가로 묶어 한 번 에이 작업을 수행 할 수있는 방법이 있습니까? 나는 다음 라인을 따라 무언가를 찾고있다.
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
기본적으로 깨끗하다면 어떤 솔루션이라도 만족할 것입니다.
편집하다
명확히하기 위해, 나는 이것이 더 큰 bash 스크립트의 일부에 대해 이야기하고 있습니다. 다른 사람들은 스크립트를 처리해야 할 수도 있으므로 깨끗하게 유지하고 싶습니다. 다음과 같은 한 줄의 bash 스크립트를 원하지 않습니다.
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
매우보기 흉하고 읽기가 어렵 기 때문입니다.
답변
어떻게 배쉬에 대한 다음 문서 :
ssh otherhost << EOF
ls some_folder;
./someaction.sh 'some params'
pwd
./some_other_action 'other params'
EOF
의견에서 @Globalz가 언급 한 문제를 피하기 위해 (원격 사이트에서 수행중인 작업에 따라) 첫 번째 줄을
ssh otherhost /bin/bash << EOF
Here 문서에서 변수 대체를 수행 할 수 있지만 인용 문제를 처리해야 할 수도 있습니다. 당신이 “제한 문자열”을 인용하는 경우 예를 들어, (예. EOF
위의), 당신은 변수를 대체 할 수 없습니다. 그러나 제한 문자열을 인용하지 않으면 변수가 대체됩니다. 예를 들어, $NAME
쉘 스크립트에서 위에서 정의한 경우 다음을 수행 할 수 있습니다.
ssh otherhost /bin/bash << EOF
touch "/tmp/${NAME}"
EOF
대상 otherhost
에 지정한 이름으로 파일을 만듭니다 $NAME
. 쉘 스크립트 인용에 관한 다른 규칙도 적용되지만 너무 복잡해서 여기에 들어갈 수 없습니다.
답변
스크립트를 로컬에서 편집 한 다음 ssh로 파이프하십시오. 예 :
cat commands-to-execute-remotely.sh | ssh blah_server
commands-to-execute-remotely.sh
위의 목록처럼 보이는 곳 :
ls some_folder
./someaction.sh
pwd;
답변
샘플 코드와 일치시키기 위해 명령을 단일 또는 이중 qoutes로 묶을 수 있습니다. 예를 들어
ssh blah_server "
ls
pwd
"
답변
두 가지 방법이 있습니다.
먼저 다음과 같이 제어 소켓을 만듭니다.
ssh -oControlMaster=yes -oControlPath=~/.ssh/ssh-%r-%h-%p <yourip>
명령을 실행
ssh -oControlMaster=no -oControlPath=~/.ssh/ssh-%r-%h-%p <yourip> -t <yourcommand>
이렇게하면 실제로 서버에 다시 연결하지 않고도 ssh 명령을 작성할 수 있습니다.
두 번째는 스크립트를 동적으로 생성하여 scp
실행하고 실행하는 것입니다.
답변
다음과 같이 수행 할 수도 있습니다. 명령을 스크립트에 넣고 이름을 commands-inc.sh로 지정하겠습니다.
#!/bin/bash
ls some_folder
./someaction.sh
pwd
파일을 저장하십시오
이제 원격 서버에서 실행하십시오.
ssh user@remote 'bash -s' < /path/to/commands-inc.sh
결코 실패하지 않았습니다.
답변
모든 명령을 스크립트에 넣고 다음과 같이 실행할 수 있습니다.
ssh <remote-user>@<remote-host> "bash -s" <./remote-commands.sh
답변
Bash에서 SSH 및 여러 명령 실행
문자열 내에서 세미콜론으로 명령을 분리하고 에코로 전달하고 모두 ssh 명령으로 파이프합니다. 예를 들면 다음과 같습니다.
echo "df -k;uname -a" | ssh 192.168.79.134
Pseudo-terminal will not be allocated because stdin is not a terminal.
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 18274628 2546476 14799848 15% /
tmpfs 183620 72 183548 1% /dev/shm
/dev/sda1 297485 39074 243051 14% /boot
Linux newserv 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux