[bash] Bash에서 여러 명령을 ssh하고 실행하는 가장 깨끗한 방법은 무엇입니까?

이미 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