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/null
EOF
답변1
Banner
SSH 서버의 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 << EOF
SSH 서버는 대화형 셸을 시작하고 표준 입력을 읽은 다음 그곳에서 문서를 사용합니다.
비대화형 쉘을 시작하려면 명령을 전달하십시오. 사용하려는 셸이어야 하며 대화형으로 시작되지 않는지 확인해야 합니다. $SHELL
여기 문서의 쉘이 무엇인지 로컬에서 알고 있으므로 원격 값이나 그 어떤 것에 의존하지 않는 것이 좋습니다 . 원래의 원격 셸은 더 이상 필요하지 않으므로 이는 exec
좋은 생각입니다.
아래 예에서 요청된 쉘은 bash
표준 입력이 tty가 아니기 때문에 대화식으로 시작되지 않습니다(비교: SSH 서버가 이를 명시적으로 요청했기 때문에 문제를 일으키는 원격 쉘은 tty에 관계없이 대화식으로 시작됩니다). .
sshpass -p 'password' ssh "$target_ip" 'exec bash' << EOF
echo \$PATH
# example
echo \$HOSTNAME
[...]
EOF
* 일반적으로 서버의 공식 기본 셸은 무엇이든 될 수 있습니다. 예를 들어 bash
시작 스크립트와 별개로 무조건 무언가를 인쇄한 다음 실행하는 래퍼 등이 있습니다 bash
. 이것은 기괴한 시나리오이지만 가능합니다.아마도그러나 실제로는 그렇지 않습니다.