여러 원격 서버에서 실행하려는 로컬 스크립트가 있습니다. 내가 사용하는 명령 구문은 다음과 같습니다.
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_*
SendEnv
ssh_config
sshd
AcceptEnv
sshd_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
--
$1
local_file_1.txt
$2
local_file_2.txt
bash -s
< local_script.sh