배너가 없는 SSH 클라이언트 연결(클라이언트에서)

배너가 없는 SSH 클라이언트 연결(클라이언트에서)

ssh저는 일부 컴퓨터에 연결하고 세션을 통해 일부 명령을 실행하는 간단한 스크립트를 작성 중입니다 .

sshpass -p 'password' ssh $target_ip << EOF
    echo \$PATH
    # example
    echo \$HOSTNAME
    [...]
EOF

작업은 정확하지만 나를 괴롭히는 것은 모든 연결에서 ssh서버 배너를 표시하고 스크립트의 나머지 부분을 방해한다는 것입니다 stdout.

Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-81-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Nov 23 11:58:14 CET 2022

  System load:  0.44               Processes:             131
  Usage of /:   9.2% of 108.79GB   Users logged in:       0
  Memory usage: 26%                IPv4 address for br0:  172.16.20.11
  Swap usage:   0%                 IPv4 address for br0:  10.130.1.1
  Temperature:  36.0 C             IPv4 address for tun0: 10.130.0.27

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

241 updates can be installed immediately.
134 of these updates are security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

그래서 나는 그 배너가 표시되는 것을 원하지 않으며오직나는 여기 있다 EOF.

관련이 있는 경우를 대비해 제가 사용하고 있는 SSH 버전은 입니다 OpenSSH_9.1p1, OpenSSL 3.0.7 1 Nov 2022.OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020

서버에서 배너를 제거하고 싶지 않습니다. sshd구성에서 제거할 수 있습니다. 내가 원하는 것은 클라이언트가 스크립트에서 배너 인쇄를 비활성화하는 것입니다.

그러나 ssh 라인 옵션은 다른 사람들에게는 효과가 있었습니다(저는여기그리고여기) 나에게는 효과가 없었습니다.

ssh -o LogLevel=error $ip

반품:

ssh -q $ip

클라이언트 수준에서 이 기능을 비활성화하려면 어떻게 해야 합니까? 이 작업을 수행할 수 있는 SSH 옵션이나 매개변수가 없나요? 그렇지 않은 경우 실행 중인 명령의 출력을 건드리지 않고 어떻게 stdout리디렉션 할 수 있습니까 ?/dev/nullEOF

답변1

BannerSSH 서버의 SSH 인증 옵션 앞의 배너입니다 . sshd_config서버 구성을 변경하지 않고는 서버가 이를 보내지 않도록 할 수 없습니다. 귀하의 클라이언트는 이를 stderr로 인쇄해야 하므로 2>/dev/null로컬에서는 표시되지 않지만 다른 메시지 ssh( sshpass귀하의 경우)도 stderr로 인쇄되지 않습니다.

SSH 이후 인증 배너는 원격 셸의 일부 시작 스크립트에서 나올 가능성이 높습니다. * 이러한 배너가 표시 되면 ssh "$target_ip" date서버의 시작 스크립트를 확인하고 배너 인쇄를 담당하는 코드를 찾아서 수정해야 합니다. 범인이 일부 전역 스크립트( 귀하의 /etc)에 있는 경우 해당 개인 스크립트( 귀하의 $HOME)를 생성하면 동작을 변경할 수 있습니다. 서버의 로그인 셸에 대한 설명서를 참조하세요.

배너가 표시되지 않으면 ssh "$target_ip" date문제의 현재 스크립트가 비대화형 셸에 대한 배너를 억제한다는 의미입니다. 이 사실을 활용하여 서버에서 아무것도 변경하지 않고 배너를 음소거할 수 있습니다.

원격 측에 초기 명령을 전달하지 않으므로 sshpass -p 'password' ssh $target_ip << EOFSSH 서버는 대화형 셸을 시작하고 표준 입력을 읽은 다음 그곳에서 문서를 사용합니다.

비대화형 쉘을 시작하려면 명령을 전달하십시오. 사용하려는 셸이어야 하며 대화형으로 시작되지 않는지 확인해야 합니다. $SHELL여기 문서의 쉘이 무엇인지 로컬에서 알고 있으므로 원격 값이나 그 어떤 것에 의존하지 않는 것이 좋습니다 . 원래의 원격 셸은 더 이상 필요하지 않으므로 이는 exec좋은 생각입니다.

아래 예에서 요청된 쉘은 bash표준 입력이 tty가 아니기 때문에 대화식으로 시작되지 않습니다(비교: SSH 서버가 이를 명시적으로 요청했기 때문에 문제를 일으키는 원격 쉘은 tty에 관계없이 대화식으로 시작됩니다). .

sshpass -p 'password' ssh "$target_ip" 'exec bash' << EOF
    echo \$PATH
    # example
    echo \$HOSTNAME
    [...]
EOF

* 일반적으로 서버의 공식 기본 셸은 무엇이든 될 수 있습니다. 예를 들어 bash시작 스크립트와 별개로 무조건 무언가를 인쇄한 다음 실행하는 래퍼 등이 있습니다 bash. 이것은 기괴한 시나리오이지만 가능합니다.아마도그러나 실제로는 그렇지 않습니다.

관련 정보