원격 컴퓨터에서 로컬 스크립트를 실행하고 인수를 포함시키는 방법은 무엇입니까?


116

로컬에서 실행될 때 잘 실행되는 스크립트를 작성했습니다.

./sysMole -time Aug 18 18

"-time" , "Aug" , "18""18" 인수 가 스크립트에 성공적으로 전달됩니다.

이제이 스크립트는 원격 시스템에서 실행되도록 설계되었지만 로컬 시스템의 로컬 디렉토리에서 실행됩니다. 예:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole

그것은 또한 잘 작동합니다. 그러나 문제는 위에서 언급 한 주장을 포함하려고 할 때 발생합니다 (-8 월 18 일 18시) .

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18

해당 스크립트를 실행 한 후 다음 오류가 발생합니다.

bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell

내가 뭘 잘못하고 있는지 말해줘


1
"Bash -s"는 표준 입력 (예 : 파일)에서 스크립트를 실행할 수있는 방법 중 하나입니다.
AllenD

답변:


160

당신은 당신의 모범에 아주 가까웠습니다. 이러한 인수와 함께 사용할 때 제대로 작동합니다.

샘플 스크립트 :

$ more ex.bash 
#!/bin/bash

echo $1 $2

작동하는 예 :

$ ssh serverA "bash -s" < ./ex.bash "hi" "bye"
hi bye

그러나 이러한 유형의 인수에는 실패합니다.

$ ssh serverA "bash -s" < ./ex.bash "--time" "bye"
bash: --: invalid option
...

무슨 일이야?

당신이 겪고있는 문제는 -time, 또는 --time내 예제에서 인수가 로 전환되는 것으로 해석된다는 것 bash -s입니다. bash인수를 사용하여 나머지 명령 행 인수를 취하지 않도록 종료함으로써 진정시킬 수 있습니다 --.

이처럼 :

$ ssh root@remoteServer "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18

#1:

$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye"
-time bye

# 2 :

$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye"
--time bye

#삼:

$ ssh serverA "bash -s" -- < ./ex.bash --time "bye"
--time bye

# 4 :

$ ssh  < ./ex.bash serverA "bash -s -- --time bye"
--time bye

참고 : 명령 행에서 리디렉션이 나타나는 위치에 차이가 없다는 것을 분명히하기 위해 ssh어쨌든 인수를 연결하여 원격 쉘을 호출 하기 때문에 원격 쉘에서 인용해야 할 때를 제외하고는 인용이 큰 차이가 없습니다. 예제 # 4 와 같이 :

$ ssh  < ./ex.bash serverA "bash -s -- '<--time bye>' '<end>'"
<--time bye> <end>

4
당신은 천재입니다! 레벨에 도달하기 위해 무엇을해야합니까? 나는 많은 일을 끊었다. 정말 고마워.
AllenD

14
@AllenD-질문을 계속하고 최대한 많이 사이트에 참여하십시오. 나는 항상 매일 새로운 것을 배우려고 노력합니다. 귀하의 질문 전에 나는 이것을하는 방법을 몰랐습니다. 8-). 질문 해 주셔서 감사합니다!
slm

5
리디렉션은 명령의 어느 시점에서나 나타날 수 있습니다 (예 : bash -s -- --time bye < ./ex.bash또는) < ./ex.bash bash -s -- --time bye. 이는 쉘이 먼저 명령에있는 위치에 관계없이 경로 재 지정 명령을 수행 한 후 경로 재 지정을 설정 한 다음 경로 재 지정을 사용하여 나머지 명령 행을 실행하기 때문입니다.
lesmana

@sim 나는 정확히 똑같은 일을하려고하지만 명령 줄이 아닌 스크립트 내에서. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 어떤 이유로 든 정확한 답을 백틱으로 묶는 것이 전혀 작동하지 않습니다. 대신 로컬로 지정된 스크립트를 실행하고 출력은 ssh를 통해 bash에 명령으로 전송됩니다.
krb686

@ krb686-새 Q로 물어 봤습니다.
slm

5

임의의 인수 처리

실제로 단일 문자열 만 사용하는 경우, 즉 -time Aug 18 18그런 다음 간단히 하드 코딩 할 수 있으며 기존 답변에 따라 적절히 수행하는 방법이 나와 있습니다. 반면, 다른 시스템에 표시 될 메시지 나 최종 사용자가 이름을 제어 할 수있는 파일 이름과 같이 알 수없는 인수를 전달해야하는 경우 더 많은주의가 필요합니다.


bash또는 ksh같은/bin/sh

/bin/shbash 또는 ksh에서 원격 을 제공하는 경우 신뢰할 수없는 인수 목록을 사용하여 다음과 같은 악의적 인 이름을 $(rm -rf $HOME).txt안전하게 전달할 수 있습니다.

runRemote() {
  local args script

  script=$1; shift

  # generate eval-safe quoted version of current argument list
  printf -v args '%q ' "$@"

  # pass that through on the command line to bash -s
  # note that $args is parsed remotely by /bin/sh, not by bash!
  ssh user@remote-addr "bash -s -- $args" < "$script"
}

POSIX 호환 /bin/sh

충분히 악의적 인 인수 데이터에 대한 안전을 위해 (가 사용하는 인용이 비 POSIX의 규격을 활용하는 시도 printf %q도 함께 인쇄 할 수없는 문자가 탈출되는 문자열에있을 때 bash는)을 /bin/sh기준-POSIX (예하다 dash거나 ash), 그것을 조금 더 흥미로워집니다.

runRemote() {
  local script=$1; shift
  local args
  printf -v args '%q ' "$@"
  ssh user@remote-addr "bash -s" <<EOF

  # pass quoted arguments through for parsing by remote bash
  set -- $args

  # substitute literal script text into heredoc
  $(< "$script")

EOF
}

사용법 (위 중 하나에 해당)

그런 다음 위에 제공된 함수를 다음과 같이 호출 할 수 있습니다.

# if your time should be three arguments
runRemote /var/www/html/ops1/sysMole -time Aug 18 18

...또는...

# if your time should be one string
runRemote /var/www/html/ops1/sysMole -time "Aug 18 18"

-3

aa는 ls를 포함하는 로컬 파일이라고 말합니다.

$ssh servername "cat | bash" < a.a

127.0.0.1을 원격 IP로 변경하십시오.

이 두 가지는 의사 tty 할당에 대한 메시지를 제공하지만 작동합니다.

$ cat a.a | ssh 127.0.0.1

$ ssh 127.0.0.1 <a.a

또는

$ cat a.a | ssh 127.0.0.1 bash or

$ ssh 127.0.0.1 bash < a.a


2
나는 이것이 질문에 얼마나 멀리 대답하는지 고심하고 있습니다.
ChrisWue

품질과 형식이 의심 스럽다. 허용 된 답변에없는 새로운 유용한 정보가 없습니다.
Julie Pelletier

@ JuliePelletier 나는 받아 들인 대답에없는 '고양이'예제를주었습니다. 다른 일을하는 방법을 아는 것이 좋습니다.
barlop

좋은 일이 아닙니다. 당신의 고양이는 쓸모가 없습니다.
Scott

2
맙소사. 나는 모두가 적어도 지금까지 그 구절을 들었다고 가정했기 때문에 쓸모없는 고양이의 사용에 대한 링크를 생략했다 . 분명히 그것은 내 입장에서 나쁜 가정이었습니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.