SSH <<-MYTAG는 SSH 연결로 파이프된 스크립트를 숨깁니다.

SSH <<-MYTAG는 SSH 연결로 파이프된 스크립트를 숨깁니다.

Jenkins 콘솔에서 명령 출력을 얻지 않고 원격 호스트에 스크립트를 전달하려고 합니다. 예제 스크립트:

ssh -o StrictHostKeyChecking=no -t -t update@dispotest  bash -s 'hello' <<'END'
printf '%s world!\n' "$1"
exit
END

다음과 같은 출력이 생성됩니다.

+ sh start_stop_jboss_remote.sh
printf '%s world!\n' "$1"

exit
[update@dispotest ~]$ printf '%s world!\n' "$1"
hello world!
[update@dispotest ~]$ 
[update@dispotest ~]$ exit
exit
Connection to dispotest closed.
Finished: SUCCESS

내 주요 문제는 두 끝 사이의 전체 섹션이 젠킨스의 콘솔 출력에 두 번이라도 게시된다는 것입니다. 첫 번째는 ssh 세션을 시작하는 것이고 두 번째는 ssh 세션 내에 있는 것 같습니다. 이로 인해 조용해 보이는 적절한 장소를 찾기가 어렵습니다. 따라서 누군가 콘솔에서 스크립트 자체를 숨기는 방법을 알고 있기를 바랍니다. 하지만 나는 완전히 벙어리가 되고 싶지는 않습니다. 나는 여전히 ssh 세션 내에서 실행되는 명령의 출력에 관심이 있습니다.

나는 많은 것을 시도했습니다 > /dev/null . 그러나 일반적으로 echo의 출력이나 셸에서 실행된 명령도 사라지지만 ID는 그대로 유지됩니다.

내가 시도한 몇 가지 예

ssh -o StrictHostKeyChecking=no -t -t update@dispotest  bash -s 'hello' <<'END'
{
printf '%s world!\n' "$1"
exit
} 2> /dev/null
END

최소한 번들 명령을 출력하십시오.

+ sh start_stop_jboss_remote.sh
{

printf '%s world!\n' "$1"
exit

} 2> /dev/null
[update@dispotest ~]$ {
> 
> printf '%s world!\n' "$1"
> exit
> 
> } 2> /dev/null
hello world!
Connection to dispotest closed.
Finished: SUCCESS

실시예 3

ssh -o StrictHostKeyChecking=no -t -t update@dispotest  bash -s 'hello' 2> /dev/null <<'END'
printf '%s world!\n' "$1"
exit
END

산출

+ sh start_stop_jboss_remote.sh
printf '%s world!\n' "$1"
exit
[update@dispotest ~]$ printf '%s world!\n' "$1"
hello world!
[update@dispotest ~]$ exit
exit
Finished: SUCCESS

실시예 4

ssh -o StrictHostKeyChecking=no -t -t update@dispotest  bash -s 'hello' 2> /dev/null <<'END'
{
printf '%s world!\n' "$1"
exit
} 2> /dev/null
END

산출

+ sh start_stop_jboss_remote.sh
{
printf '%s world!\n' "$1"
exit
} 2> /dev/null
[update@dispotest ~]$ {
> printf '%s world!\n' "$1"
> exit
> } 2> /dev/null
hello world!
Finished: SUCCESS

답변1

를 사용하여 대화형 로그인 셸을 호출할 수 있습니다 -t -t. 명령줄에서 제거하세요.

스크립트에 인수를 전달하는 올바른 방법 bash -s은 다음과 같습니다.

bash -s "$COMMAND" "$SERVICENAME" <<'END_SCRIPT'
here goes
script that uses
"$1" and "$2"
END_SCRIPT

$COMMAND스크립트에는 및 값이 전달되며 이러한 값은 스크립트에서 및 $SERVICENAME으로 사용할 수 있습니다 $1. $2스크립트 자체도 인용해야 하며, 이는 처음에 here-document 태그를 인용하여 수행됩니다.

귀하의 경우:

ssh -o StrictHostKeyChecking=no "user@$SERVER"  bash -s "$COMMAND" "$SERVICENAME" <<-'ENDSSH'
        echo "I'd like to see this"
        if [ "$1" = "stop" ]; then
            ...
        fi
ENDSSH

후행 표시 는 ENDSSH첫 번째 열(줄의 첫 번째 열)에 있거나 탭을 사용하여 들여쓰기해야 합니다.

나에게 도움이 된 예:

ssh myhost bash -s 'hello' <<'END'
printf '%s world!\n' "$1"
END

hello world!터미널에 문자열을 생성합니다.

관련 정보