서브쉘의 출력을 프로세스로 리디렉션

서브쉘의 출력을 프로세스로 리디렉션

SSH에서 스크립트를 실행하고 일부 매개변수를 스크립트에 전달하려고 합니다. 다음을 시도했지만 성공하지 못했습니다. 값이 전달되지 않았습니다.

$ LC_FOO=x ssh -o SendEnv=LC_FOO $HOST < myLongScript.sh

대상 호스트는 때때로 매우 제한적이고 정기적으로 다시 생성되므로 SSH 설정을 변경하는 것은 소용이 없습니다.

그래서 트릭을 사용하여 스크립트 자체 내에서 값을 전달하려고 했습니다. 즉, 스크립트에 변수를 추가하고 싶습니다.

나는 또한 다른 방법을 시도했습니다:

# doesn't work - 'ambiguous redirect'
$ ssh ... < $(...)

# doesn't work - 'LC_FOO=x: command not found'
$ $(echo "FOO=x"; cat myLongScript.sh) | ssh ...

ssh입력 앞에 해당 줄을 어떻게 추가합니까 ?

답변1

당신은 하나를 원한다프로세스 교체예를 들어 ssh ... < <(...). ssh ... < $(my_command)명령 대체각각에 대한 리디렉션을 만듭니다.단어my_command리디렉션 대상이 되어 발생하는 결과입니다.

답변2

LC_FOO첫 번째 예는 AcceptEnv서버 측 파일 목록에 있도록 변수를 활성화하면 작동합니다./etc/ssh/sshd_config

$ grep AcceptEnv /etc/ssh/sshd_config
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
AcceptEnv LC_FOO

이제 작동합니다:

$ LC_FOO=x ssh -o SendEnv=LC_FOO [email protected] 'printenv LC_FOO'
x

대안

리디렉션 방법

저는 다음과 같은 제목의 또 다른 U&L Q&A에서 이를 시연했습니다.원격 시스템에서 로컬 스크립트를 실행하고 매개변수를 포함하는 방법은 무엇입니까?, 귀하의 예를 들어 다음을 제안합니다.

$ ssh serverA "bash -s" -- < ./ex.bash "arg1" "arg2"
정리 방법

다른 U&L Q&A 제목에서 강조한 heredoc 스타일을 사용할 수도 있습니다.쉘 스크립트에서 $PATH의 원격 값 보기:

[root@skinner ~]# ssh mulder 'bash -s <<EOL
>   echo $HOSTNAME
>   hostname
> EOL'
mulder.bubba.net
mulder.bubba.net

인용하다

관련 정보