원격 호스트에서 로컬 입력 파일을 사용하여 로컬 스크립트 실행

원격 호스트에서 로컬 입력 파일을 사용하여 로컬 스크립트 실행

여러 원격 서버에서 실행하려는 로컬 스크립트가 있습니다. 내가 사용하는 명령 구문은 다음과 같습니다.

ssh <remote_server> "bash -s" < ./local_script.sh

이것은 잘 작동하며 매개변수를 전달할 수도 있습니다.local_script.sh. 그러나 다음과 같이 입력 파일을 전달하고 싶습니다.

local_script.sh < local_file.txt

이 두 명령문을 결합하면 다음이 제공됩니다.

ssh <remote_server> "bash -s" < ./local_script.sh < local_file.txt

내가 이것을 실행하면, 나는 얻는다.

bash: line 1: FOO: command not found
bash: line 2: BAR: command not found
bash: line 3: BAZ: command not found
...

여기서 FOO, BAR, BAZ 등은 각 줄의 첫 번째 단어입니다.local_file.txt:

FOO     FOO_PARAM1
BAR     BAR_PARAM1
BAZ     BAZ_PARAM2
...

그래서 "bash -s"원격 서버에서 해석하는 것처럼 보입니다.local_file.txt입력 파일 대신 스크립트 파일로local_script.sh. 이 문제를 해결할 수 있는 방법이 있습니까(래퍼 스크립트를 만드는 것 외에)?

답변1

ssh두 개의 별도 출력 스트림(stdout 및 stderr용)을 제공 하지만 하나의 입력 스트림(stdin)만 공급합니다. 따라서 다른 메커니즘을 통해 스크립트 콘텐츠와 입력 파일을 전달해야 합니다.

예를 들어, 하나는 변수를 통해, 다른 하나는 stdin을 통해:

LC_CODE=$(cat local_script.sh) ssh host 'eval "$LC_CODE"' < input

( 클라이언트가 변수( in ) 를 ssh전달 하고 서버가 이를 수락한다고 가정합니다( in ))LC_*SendEnvssh_configsshdAcceptEnvsshd_config

local_script.sh또는 원격 사용자의 로그인 셸이 해당 스크립트 구문에 적합하다고 가정하고 원격 셸 코드로 내용을 전달하면 됩니다 .

ssh host "$(cat local_script.sh)" < input

ssh또는 다음과 같이 '의 stdin 에 입력된 코드와 입력을 연결합니다 .

{
  echo '{'; cat local_script.sh; echo '}; exit'
  cat input
} | ssh host 'bash -s some arguments'

여기에서 사용 bash하면 입력을 한 번에 한 바이트씩 읽어서 다른 모든 쉘이 그렇게 하지 않는 동안 bash해당 행을 지나 읽지 않도록 처리합니다 .}; exit

또는 sed원격 호스트에 GNU가 있는 경우 sed:

echo '#END-OF-SCRIPT' | cat local_script.sh - input |
  ssh host 'set some arguments; eval "$(sed -u "/^#END-OF-SCRIPT/q")"'

(여기서는 원격 사용자의 로그인 셸에서 코드를 평가하고 Bourne과 유사하다고 가정합니다)

답변2

BASH 'here-strings' 연산자('<<<')를 사용하는 보다 우아한 솔루션은 다음과 같습니다.

ssh -t host "/bin/bash <(base64 --decode <<<'$(base64 < script)' )"

IT는 스크립트를 가져와서 base64 문자열로 변환하고, SSH 명령을 통해 다시 변환하여 bash에 파이프 파일 이름으로 제공합니다.

대화형 쉘 접두사 '파이프 파일 이름'을 "--rcfile"로 설정하는 스크립트의 경우

ssh -t host "/bin/bash --rcfile <(base64 --decode <<<'$(base64 < script)' )"

더 자세히... https://antofthy.gitlab.io/info/apps/ssh_remote_commands.txt

답변3

이것은 잘 작동하며 여러 파일의 내용을 스크립트에 전달할 수도 있습니다.

ssh host "bash -s -- '$(cat local_file_1.txt)'  '$(cat local_file_2.txt)'" < local_script.sh

설명은 이후의 모든 스크립트 인수를 사용하여 로그인 시 ssh실행된다는 것입니다 . 의 내용도 마찬가지 이고 의 내용도 마찬가지입니다 . 에서 오는 stdin에서 명령을 읽습니다 .bash -s--$1local_file_1.txt$2local_file_2.txtbash -s< local_script.sh

관련 정보