클라이언트에서 ssh 로그인 인쇄를 중지 하시겠습니까?


43

SSH 비밀번호를 설정하지 않았지만 로그인 할 때 MoTD를 인쇄합니다. 클라이언트 측에서 발생하는 것을 막을 방법이 있습니까?

시도 ssh -q했지만 작동하지 않습니다. ~/.hushlogin서버 설정 을 사용하고 싶지 않거나 변경하고 싶지 않습니다. 작동 할 수있는 유일한 것은로 모든 출력을 조용하게하는 것입니다 >/dev/null 2>&1. 그러나 실제로 문제가있는 경우 오류를 무시하고 싶지 않습니다. 심지어 일을 >/dev/null하기 때문에 작동하지 않습니다 ssh표준 에러에 MOTD를 인쇄 할 것으로 보인다.

업데이트 및 추론 나는 cron에서 백업을 실행 중입니다. 오류가 발생하지 않는 한 cron 이메일을 받고 싶지 않습니다. 그러나 motd가 인쇄되면 항상 이메일을 받게됩니다.

법적인 영향을 미치기 때문에 motd를 계속 인쇄하고 싶습니다. 모토는 "무인 액세스 금지"라고 말합니다. 사람들이 불법적으로 접근하지 못하도록 법적인 접근을 막기 위해서는 이런 종류의 진술이 있어야합니다. 따라서 담요를 항상 비활성화하지 않으려 고합니다.


1
cron 작업에 대한 세부 사항을 추가 할 수 있습니까?
Kyle Brandt

1
motd는 대화식 세션에만 인쇄됩니다. 방금 테스트 한 결과 다음과 같습니다.> $ ssh host → MOTD 인쇄> $ ssh host ls → 홈 디렉토리의 내용 만 인쇄합니다. 다시 말해서, 당신은 뭔가 잘못하고 있습니다; 당신도 시도 했습니까?
niXar

또한 /etc/profile.d실행될 수있는 스크립트 를 체크인하고 로그인시 콘솔에 일부 출력을 인쇄하는 것도 주목할 가치가 있습니다 .
Dave

4
"무단 액세스 금지"라고 말하는 법이 실제로 있습니까? 나는 DMCA가 (전자 시스템의 어떤 종류를 깰 불법하지 않습니다 생각 없이 제대로 보호 방법 않도록 당신이 암호 / SSH 키 요구 사항의 일종을 가지고, 이것은 순수한 윈도우 드레싱처럼 보인다).
Nick T

답변:


57

왜 당신이 이것을 올바르게 할 혐오감을 가지고 있는지 확실하지 않습니다-서버

PrintMotd no
PrintLastLog no

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

또는 각 사용자마다 ~ / .hushlogin을 추가하십시오.

~ / .hushlogin의 경우 / etc / skel에 추가하여 새 사용자 홈 디렉토리가 파일로 작성되도록하십시오.

최신 정보:

백업 cron 작업에 대한 자세한 정보가 없으면 명령의 출력을 파일로 리디렉션하거나 cron에서 전자 메일로 캡처하도록하고 ssh 세션의 출력을 / dev / null로 바꾸는 것이 좋습니다. 다음과 같은 것 :

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null

또는

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null

나는 명령을 약간 가지고 놀아야하지만 시작해야합니다.


3
나는 "정확히하는 것"을 좋아한다.
Benoit

14
법적인 이유로 '승인 된 액세스 금지'통지를 유지해야하므로 서버에서 제거하고 싶지 않습니다.
Rory

3
Fwiw는이 통지가 무단 액세스를 방지하는 것이 아니라 전화 대화 녹음에 대한 알림과 같이 적절한 법적 조치를 취할 수 있고 사용하겠다고 사람들에게 알릴뿐입니다.
jtimberman

또한 사용중인 크론 작업을 붙여 넣으면 크게 도움이됩니다.
jtimberman

3
.hushlogin멋지다
andrewtweber

15

사용자별로이 작업을 수행하려면 A 만 수행하면 touch ~/.hushloginOpenSSH가 설정됩니다.

업데이트 : 다른 곳에서 지적했듯이 pam_motd사용자별로 사용하지 않도록 구성 할 수 있습니다 .hushlogin. 확인 /etc/login.defs을 위해 HUSHLOGIN_FILE. 모든 사용자를 나열 /etc/hushlogins하거나 유사 하게 구성 할 수 있습니다 .


2
나는 그것을 시도했지만 작동하지 않았다. 다른 사람들이 지적했듯이, motd는 pam에서 인쇄 될 수 있습니다
Rory

11

@note 모든 예제는와 connectionString같은 변수 를 설정했다고 가정합니다 connectionString=user@server.

내가 해결책을 얻는 방법

ssh -T간단한 명령에는 사용하는 것이 좋습니다. 예를 들어 이것은 추가 정보를 인쇄하지 않습니다.

ssh -T $connectionString "echo 'blah'"

here-doc을 사용하여 많은 명령을 실행하려고 할 때 문제가 발생합니다. 예를 들어 다음과 같이 작동하지 않습니다. 오늘의 메시지 (MoTD)가 표시되고 "stdin : is a tty"가 표시 될 수 있습니다.

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

이 문제를 해결하려면 먼저 로컬 변수에 명령을 저장하고 원격 서버로 보내야합니다.

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"

그러나 그것은 지저분합니다 ...

마지막 해결책

범용 함수를 만듭니다 (문자열 또는 HEREDOC을 명령으로 사용할 수 있음).

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}

이렇게 사용하십시오 :

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

또는 이렇게 :

silentSsh $connectionString "echo 'blah'"

또는 이렇게 :

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC

또는 그렇게 :

silentSsh $connectionString < getlines.sh

나는 이것에 대해 더 많은지지를 얻었 으면 좋겠다. 우리가해야 할 오버 스크립팅을 알아내는 데 매우 도움이됩니다.
csexton

환상적인 답변 !! 대단히 감사합니다 !!
Scottie H

10

이 해킹은 어떻습니까? ;-피

ssh -t user@machineName '/bin/bash'

다음은 유효 하지 않습니다 :

-Ttty 할당을 비활성화하기 위해 ssh로 전달 :

ssh -T machineName 'echo foo'

3
ssh user @ machine 'your command here'는 어쨌든 motd를 표시하지 않습니다 (대화식 쉘이 아님).
마리 피셔

오 좋은 지적 ..
Kyle Brandt

하지만 그 의미 "그것은 대화 형 쉘 아니다"내가 노력하고 내가 사용하여 누락 된 것입니다 무슨 명령을 실행할 수 있기 때문에-t
piekarz Ciasto을

"-t"를 추가하면 동작이 변경됩니다 (TERM 설정에 따라 표시되고 필요할 때 제어 문자 추가 등). 일부 명령의 결과를 변경할 수 있습니다 (예를 들어 다음과 같은 경우 오류가 발생할 수 있습니다 : ssh -t somehost "tar cf-일부 파일"> local.tar # -t를 사용하지 마십시오 ... 특히 유닉스 호스트를 ssh 창문 하나이지만 다른 경우에는 다른 많은 문제가 발생할 수 있습니다). : 멋진 @StephaneChazelas 대답을 참조하십시오 unix.stackexchange.com/questions/151916/...
올리비에 Dulac

3

이것은 어떤 운영 체제입니까? 우분투와 같은 일부 시스템에서는 motd가 ssh 서버 (/ etc / ssh / sshd_config의 PrintMotd)에 의해 인쇄되지 않고 pam_motd와 함께 pam에 의해 인쇄됩니다. 이 경우 클라이언트에서 제어 할 수 없습니다.


당신은 ssh 클라이언트에서 그것을 제어 할 수 없지만, 당신은 확실히 클라이언트 쪽에서 할 수 있습니다 :) .. 자세한 내용은 내 대답을 참조하십시오
drAlberT

아니요, 인쇄 된 motd에 대해 꽤 흥미롭고 영리한 해킹을 제안했지만 클라이언트가 인쇄를 중지하는 해결책은 아닙니다.
theotherreceive

2

서버에서 수행해야합니다.

PrintMotd no
PrintLastLog no

debian / ubtuntu에서 pam_motd.so로 줄을 해시하십시오.

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

아뇨. 아래의 Kyle Brandt의 답변을 참조하십시오.
Stobor

-1-답변에 편집 된 질문이 반영되지 않습니다. 더 이상 관련이 없습니다.
romandas

2

cron이 직접 ssh 명령을 실행하지 마십시오.

대신 도우미 bash 스크립트 를 작성하고 ssh 작업을 실행하고 필요한 경우 출력, 오류 및 오류 코드를 가져옵니다. 결국 오류 메시지 (필자의 경우 MoTD)에서 원치 않는 문자열을 제거하기 위해 구문 분석 한 다음 bash 스크립트 출력과 오류 스트림에서 다시 인쇄하여 이러한 방식으로 얻은 내용을 다시 인쇄하십시오.

이 bash 스크립트를 cron에 넣고 행복하게 사는 것보다 :)

참고 : 이것은 일반적인 솔루션이며 ssh를 통해 수행해야하는 모든 작업을 수행해야합니다. 그것은 또한 클라이언트 측이며, 귀하의 요구를 충족시켜야합니다 ... 서버 구성에서 클라이언트의 유일한 의존성은 std err 또는 ssh 클라이언트에서 잘라내려는 정확한 메시지에 대한 지식입니다.


2
해결 방법이 아닙니다.
niXar

죄송 합니다만 동의 할 수 없습니다. IMHO는 일이 깨끗하게 수행되어야하는 방법입니다 ... sd 클라이언트를 motd를 무시하도록 명시 적으로 구성하는 방법이 있다면 동의합니다. 단지 sshd 제어가 아니기 때문에 존재할 수 없습니다. !
drAlberT

2

단지 참고 사항 (내가 게시 할 수 있다면 주석이되었을 것입니다) : motd의 내용은 시스템에 성공적으로 로그인 한 후에 표시 됩니다. 사람들이 합법적으로 상자에 액세스하는 것을 막고 싶다면 sshd_config의 "배너"를 사용하십시오. 사용자 이름을 입력 한 후 인증하기 전에 내용이 표시됩니다.


4
예, 그러나 ssh 클라이언트에서 -q를 사용하여 배너를 비활성화 할 수 있으므로 귀하의 메모에 동의하지 않습니다
drAlberT

1
오 소년, 나는 그것을 완전히 볼 수있다, "-q"는 Dynacorp Inc.를 위해 일하는 균열 법률 팀의 전체 방어를 물리 친다. 그들은 그것이 오는 것을 보지 못했습니다. 현실을 얻으십시오. 배너를 보려는 사람이 의도적으로 배너를 피한다면 ... 배너를 피하기 위해 알아야했기 때문에 배너는 여전히 구속력이 있습니다.
niXar

2

설명하려는 내용을 시도하지 않았거나 서버가 잘못 구성되었습니다!

RHEL5에서 방금 시도한 내용은 다음과 같습니다.

workstation ~ $ ssh root@server
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh root@server
MOTD
server ~ # ^D
workstation ~ $ ssh root@server echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

비 대화식 쉘로 고지 사항을 보내야한다고 생각하지 않습니다. (누군가가 주장한다면, 나에게 호의를 베풀어야한다.) 대화 형 쉘과 비 대화식 쉘이 구별되는 이유가 바로 여기에 있기 때문이다.

그러나 어쨌든 cron의 메일을 좋아하지 않기 때문에 내가하는 일이 있습니다. 출력을 로거로 파이프합니다. 꼬리를 통해 파이프로 무의미한 고지 사항의 처음 몇 줄 (3을 말하십시오)을 제거하십시오 (예상치 않은 코드, 내 스크립트에 액세스 할 수 없음).

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job

man sshd를 보면 다음과 같이 표시됩니다. 로그인 프로세스 사용자가 성공적으로 로그인하면 sshd는 다음을 수행합니다. 1. 로그인이 tty에 있고 명령이 지정되지 않은 경우 마지막 로그인 시간을 인쇄합니다 / etc / motd (구성 파일에서 또는 ~ / .hushlogin에 의해 방지되지 않는 한, 파일 섹션 참조). 2. ... ssh 로그인에서 디렉토리에 명령을 입력하면 MOTD가 표시되지 않습니다.
katriel

나는 그것이 내가 보여주는 것을 알고 있습니다. 너의 요점이 뭐야?
niXar

1

내가 당신을 이해한다면, 당신은 다른 이유로 운동이 필요하지만 백업을 위해 운동이 필요하지 않습니다. sshd의 구성에서는 전역으로 만 사용자별로 설정할 수 없습니다. 따라서 클라이언트 측에서 motd supression을 해결해야합니다. 그러나 motd의 텍스트와 백업 소프트웨어의 오류 메시지에는 차이가 없습니다. 둘 다 터미널의 텍스트입니다. 이 두 메시지를 차별화하고 motd의 메시지를 필터링하는 유일한 방법입니다. 소프트웨어 메시지는 수정하기 어렵 기 때문에 motd의 텍스트를 수정하는 것이 좋습니다. 예를 들어 프레임을 배치하십시오.

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

그런 다음 프레임 사이의 텍스트를 필터링하여 삭제해야합니다.


1

여기에 솔루션 :

서버를 담당하지 않고 motd 또는 sshd 구성을 변경할 수없는 경우 다음과 같은 명령을 사용하십시오.

원격 명령을 보려면 STDERR을 STDOUT으로 리디렉션하십시오. 그런 다음 ssh의 STDERR을 / dev / null로 리디렉션하십시오. MOTD는 STERR로 가서 / dev / null로 끝납니다. 원격 명령의 표준 AND 오류 메시지가 표시됩니다 (STDOUT으로 이동).

변형 1-원격으로 실행 된 명령의 종료 상태에 관심이있는 경우 :

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

변형 2-원격 명령의 종료 코드를 무시하려면 마지막 원격 명령으로 true를 실행하십시오.

ssh remotehost "(remote_command; true) 2>&1" 2>/dev/null || echo SSH connection failed

오류 메시지의 예 :

예 1 :

ssh remotehost " failed_ remote_command 2> & 1"2> / dev / null || echo SSH 연결 실패 또는 원격 명령이 0이 아닌 종료 코드 bash를 리턴했습니다
 . failed_remote_command : 명령을 찾을 수 없습니다
SSH 연결 또는 원격 명령이 실패했습니다. 둘 중 하나가 0이 아닌 종료 코드 127을 리턴했습니다.

예 2 :

ssh remotehost " failed_ remote_command 2> & 1; true "2> / dev / null || echo SSH connection failed
 bash : failed_remote_command : 명령을 찾을 수 없습니다

실시 예 3a :

ssh remotehost " failed_ remote_command 2> & 1; true"2> / dev / null || echo SSH connection failed
 # 메시지가 표시되지 않습니다

예 3b :

ssh nonexistinghost " failed_ remote_command 2> & 1; true"2> / dev / null || 반향 SSH 연결 실패
 SSH 연결 실패

0

motd 파일에서 텍스트를 제거해 보셨습니까? 그냥 생각이야

Hint: /etc/motd

4
그는 sshd_config에 아무런에 PrintMotd을 설정하지 않는 서버 측에서 아마 더 좋을 것이다, 클라이언트 측에서 말했다
카일 브랜

0

무엇을하려고합니까? MoTD가 왜 귀찮게합니까? 원격 명령을 실행하고 출력을 구문 분석하는 것 같아요? 그렇다면, 이것은 대화식 쉘을 호출하지 않고 다양한 방법으로 수행 될 수 있습니다 (이로 인해 motd가 표시됩니다).


아 같은? 난 정말 ssh 생각을 사용하고 싶습니다 ..
Rory

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.