다른 ssh 명령 내에서 ssh를 명령으로 실행

다른 ssh 명령 내에서 ssh를 명령으로 실행

SSH를 통해 액세스할 수 있는 머신에서 프로그램을 실행하고 싶고, SSH를 통해 게이트웨이 머신에도 액세스할 수 있습니다.

대상 컴퓨터에서 mpi 프로그램을 실행하려면 T일반적인 방법으로 로컬 컴퓨터에서 게이트웨이에 액세스합니다.G

ssh user@Gateway

G컴퓨터 에 들어가면 다음 과 같이 대상 컴퓨터에서 프로그램을 시작합니다.

ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'

이렇게 하면 모든 것이 잘 작동합니다( 전에 필요 ssh-agent하고 실행한다는 점에 유의 하세요.ssh-addmpirun이 문제에 대한 세부정보.)

아래와 같이 게이트웨이에 액세스할 때 두 번째 ssh 명령을 로컬 컴퓨터의 ssh 명령에 직접 전달하고 싶습니다.

ssh user@Gateway "ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

"그런데 이게 생각 대로 안 되더라구요 .

추신: ssh-agent-forwarding을 사용할 수 없습니다.

답변1

명령은 $(ssh-agent -s)큰따옴표로 묶여 있으므로 로컬 컴퓨터에서 실행됩니다. 게이트웨이에서 실행하려는 전체 명령을 작은따옴표 안에 넣어야 합니다. 명령 자체에는 작은따옴표(대상에서 실행되어야 하는 코드를 보호하기 위해)가 포함되어 있으므로 이러한 작은따옴표를 이스케이프해야 합니다 '\''.

ssh user@Gateway 'ssh Target '\''eval $(ssh-agent -s); ssh-add my_key; mpirun --hostfile .hosts program'\'

로컬 SSH 클라이언트를 구성하여 게이트웨이 단계를 자동화할 수 있습니다. 이것을 당신의 ~/.ssh/config:

Host Target
User user
ProxyCommand ssh Gateway nc %h %p

nc인터넷 고양이. 그런 다음 실행

ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'

로컬 컴퓨터에서 직접.

답변2

당신은 탈출했습니다 $. 그렇지 않으면 $(ssh-agent -s)게이트웨이 머신 대신 로컬 머신에서 평가가 수행됩니다.

ssh user@Gateway "ssh Target 'eval \$(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

echo를 사용하여 이스케이프된 결과를 확인할 수 있습니다.

$ echo "foo $(echo bar)"
foo bar
$ echo "foo \$(echo bar)"
foo $(echo bar)

관련 정보