Parar o login ssh de imprimir motd a partir do cliente?


44

Eu tenho o SSH sem senha configurado, no entanto, ele imprime o MoTD quando faz login. Existe alguma maneira de impedir que isso aconteça do lado do cliente?

Eu tentei, ssh -qmas isso não funciona. Não quero usar ~/.hushloginnem quero alterar a configuração do servidor. A única coisa que pode funcionar é acalmar toda a saída, com >/dev/null 2>&1. No entanto, não quero ignorar erros, caso haja realmente um problema. Mesmo fazendo >/dev/nullnão funciona, pois sshparece imprimir o motivo no stderr.

Atualização e raciocínio Estou executando o backup em um cron. Não quero receber um e-mail cron, a menos que tenha ocorrido um erro. No entanto, se o motd for impresso, recebo um e-mail o tempo todo.

Quero manter o motd sendo impresso, porque isso tem implicações legais. O motd diz "acesso não autorizado proibido". Você precisa ter esse tipo de declaração para impedir legalmente as pessoas de acessá-lo (como um sinal de não invasão). Portanto, não quero desabilitá-lo o tempo todo.


1
Você pode adicionar alguns detalhes sobre o trabalho cron ...
Kyle Brandt

1
O motd é impresso apenas para sessões interativas. Acabei de testar e é assim:> $ ssh host → MOTD impresso> $ ssh host ls → imprime apenas o conteúdo do diretório inicial Em outras palavras, você está fazendo algo muito errado; você já tentou?
NiXar 09/08/2009

Também é importante destacar o check-in /etc/profile.dde qualquer script que possa ser executado lá e imprimir alguma saída no console no login.
Dave

4
Existe realmente uma lei que exige que você diga "acesso não autorizado proibido"? Eu pensei que o DMCA tornasse ilegal interromper qualquer tipo de sistema eletrônico ( não importa o quão mal protegido ), desde que você tenha algum tipo de requisito de senha / chave SSH, isso parece pura limpeza de janela.
Nick T

Respostas:


58

Não sei por que você tem aversão a fazer isso corretamente - no servidor a la

PrintMotd no
PrintLastLog no

e

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

Ou adicionando ~ / .hushlogin para cada usuário.

Dica, para ~ / .hushlogin, adicione-o ao / etc / skel para que novos diretórios pessoais do usuário sejam criados com o arquivo.

Atualizar:

Sem mais informações sobre sua tarefa cron de backup, minha única outra sugestão é redirecionar a saída do comando para um arquivo (ou permitir que o cron a capture por email) e a saída da sessão ssh para / dev / null. Algo como:

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

Ou

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

Eu teria que brincar um pouco com os comandos, mas isso deve ajudá-lo a começar.


3
Eu gosto do "fazer corretamente".
Benoit

14
Não quero removê-lo do servidor, pois preciso manter um aviso de 'acesso autorizado proibido' por motivos legais.
Rory

3
Fwiw, o aviso não impede o acesso não autorizado, apenas notifica as pessoas de que você pode (e irá) tomar as medidas legais apropriadas e pode estar monitorando seu uso, assim como a notificação sobre a gravação de uma conversa telefônica.
jtimberman

Além disso, ajudaria muito se você colasse o trabalho cron que está usando.
jtimberman

3
.hushloginé bom
andrewtweber 27/03

16

Se você quiser isso por usuário, basta fazer um touch ~/.hushlogine está tudo pronto com o OpenSSH.

Atualização : como indicado em outro lugar, pam_motdpode ser configurado para não usar um por usuário .hushlogin; verificar /etc/login.defspara HUSHLOGIN_FILE. Pode ser configurado para ter todos os usuários listados /etc/hushloginsou similares.


2
Eu tentei isso, mas não funcionou. Como já foi salientado, a motd pode ser impresso a partir pam
Rory

11

Todos os exemplos assumem que você definiu uma variável connectionStringcom algo parecido connectionString=user@server.

Como cheguei à solução

O uso ssh -Tdeve funcionar para comandos simples. Por exemplo, isso não imprime nenhuma informação extra:

ssh -T $connectionString "echo 'blah'"

O problema é quando você tenta usar o here-doc para executar muitos comandos. Por exemplo - abaixo não funcionará - ecoará a mensagem do dia (MoTD) e também poderá mostrar "stdin: não é um tty".

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

Para solucionar o problema, primeiro você precisa salvar comandos na variável local e enviá-los ao servidor remoto.

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

Mas isso é bagunçado ...

Solução final

Crie uma função universal (observe que ela pode receber uma string ou HEREDOC como comandos).

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

Exemplos

Use isso da seguinte maneira:

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

Ou assim:

silentSsh $connectionString "echo 'blah'"

Ou assim:

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

Ou mesmo assim:

silentSsh $connectionString < getlines.sh

Eu gostaria de ter mais votos para isso. Muito útil para descobrir alguns scripts over-ssh que precisávamos fazer.
csexton

Resposta fantástica !! Muito obrigado!!
Scottie H

10

Que tal esse hack? ;-P

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

O seguinte não é válido:

Passando -Tpara o ssh para desativar a alocação de tty:

ssh -T machineName 'echo foo'

3
ssh user @ machine 'your command here' não mostra o motd de qualquer maneira (não é um shell interativo).
Marie Fischer

Oh boa, ponto ....
Kyle Brandt

mas o que isso significa "não é um shell interativo" desde que eu tentei e eu posso executar comandos que eu estaria faltando usando-t
ciasto Piekarz

observe que adicionar "-t" altera o comportamento (ele é exibido de acordo com as configurações do TERM, adiciona caracteres de controle quando necessário, etc.). Ele pode alterar o resultado de alguns comandos (por exemplo, pode introduzir erros em: ssh -t somehost "tar cf - alguns arquivos"> local.tar # NÃO use -t aqui ... especialmente se você ssh um host unix de um windows one. mas muitos outros problemas podem surgir em outros casos). Veja a maravilhosa resposta de @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Olivier Dulac

3

Que sistema operacional é esse? Em alguns sistemas (como o ubuntu), o motd não é impresso pelo servidor ssh (PrintMotd em / etc / ssh / sshd_config), mas por pam com pam_motd. Se for esse o caso, você provavelmente não poderá controlá-lo pelo cliente.


você não pode controlá-lo no cliente ssh, mas você pode com certeza no lado do cliente :) .. ver a minha resposta para mais detalhes
drAlberT

Não, você propôs um truque bastante interessante / inteligente em torno do motivo que está sendo impresso, não uma solução para impedir que ele seja impresso pelo cliente, que era a questão.
theotherreceive

2

Você precisa fazer isso no servidor:

PrintMotd no
PrintLastLog no

No debian / ubtuntu também use a linha pam_motd.so:

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

Não, você não. Veja a resposta de Kyle Brandt abaixo.
Stobor

-1 - A resposta não reflete a pergunta editada. Não é mais relevante.
Romandas 06/08/09

2

Não execute o comando ssh diretamente pelo cron.

Crie um script bash auxiliar , executando o trabalho ssh e buscando a saída, os erros e o código do erro, se necessário; eventualmente, analise-as para remover as seqüências indesejadas das mensagens de erro (o MoTD no seu caso) e, em seguida, imprima na saída do script bash e nos fluxos de erros o que você obteve dessa maneira.

Então coloque esse script bash no cron e viva feliz :)

Nota: Esta é uma solução geral e deve funcionar independentemente da tarefa que você deve executar via ssh. Também é apenas do lado do cliente, o que deve atender às suas necessidades ... a única dependência do cliente na configuração do servidor é o conhecimento da mensagem exata que você deseja eliminar do std err ou do ssh client


2
Essa não é uma solução que é uma solução alternativa.
NiXar 09/08/2009

Não posso concordar com você, desculpe. IMHO é assim que as coisas devem ser feitas de maneira limpa ... Eu concordei com você se houvesse uma maneira de configurar explicitamente o cliente ssh para ignorar o motd, mas ele não pode existir, simplesmente porque não está sob o controle sshd !
drAlberT

2

Apenas uma nota lateral (teria sido um comentário, se eu pudesse postar isso): O conteúdo do motd é mostrado após o login bem-sucedido no sistema. Se eu quiser impedir legalmente as pessoas de acessar uma caixa, prefiro fazer isso com um "Banner" no sshd_config. O conteúdo é exibido após a inserção do nome de usuário, mas antes da autenticação.


4
sim, mas você pode desativar a faixa usando q no cliente ssh, então eu não posso concordar com sua nota
drAlberT

1
Oh, garoto, eu posso ver totalmente, "-q" derrotando toda a defesa do time jurídico de crack que trabalha para a Dynacorp Inc. Puxa! Eles não viram isso acontecer. Seja real. Se alguém que deveria ver o banner evitá-lo de propósito ... o banner ainda é obrigatório, pois você precisava conhecê-lo para evitá-lo.
NiXar 09/08/2009

2

Ou você não tentou o que está descrevendo ou seus servidores estão configurados incorretamente!

Aqui está o que eu tentei no 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 ~ $ 

Suponho que você não precise que o aviso seja enviado a conchas não interativas, precisa? (Se alguém o reivindicar, faça-me um favor, dê um chute no saco.) Porque é exatamente por isso que há uma distinção entre conchas interativas e não interativas.

Mas, de qualquer forma, eis o que faço porque não gosto de emails do cron: canalizo a saída para o logger. Basta passar pela cauda para remover as primeiras (digamos 3) linhas do seu aviso inútil como tal (código não testado, não tenho acesso aos meus scripts):

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

Se você procurar no man sshd, verá o seguinte: PROCESSO DE LOGIN Quando um usuário efetua login com êxito, o sshd faz o seguinte: 1. Se o login estiver em um tty e nenhum comando tiver sido especificado, imprime o último horário do login e / etc / motd (a menos que impedido no arquivo de configuração ou por ~ / .hushlogin; consulte a seção FILES). 2. ... Aviso que, se um comando é inserido diretório de login ssh, não MOTD é exibido
Katriel

Eu sei, era o que eu estava demonstrando. Onde você quer chegar?
NiXar

1

Se eu entendi, você precisa do motd por outros motivos, mas não precisa do motd para backup. Na configuração do sshd não é possível configurá-lo por base do usuário apenas globalmente. Portanto, você precisa resolver a supressão do motd no lado do cliente. Mas não há diferença entre o texto do motd e as mensagens de erro do software de backup. Ambos são textos no terminal. A única solução que vejo para fazer diferença entre essas duas mensagens e depois filtrar a do motd. Como as mensagens do software são difíceis de modificar, sugiro modificar o texto do motd. Por exemplo, coloque um quadro ao redor:

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

motd message

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

Então você deve filtrar o texto entre o quadro e soltá-lo.


1

SOLUÇÃO AQUI:

Caso você não seja o responsável pelo servidor e não possa alterar a configuração do motd ou do sshd, use o comando da seguinte maneira:

Redirecione STDERR para STDOUT para comando (s) remoto (s) para que você o veja. E, em seguida, redirecione STDERR do ssh para / dev / null. MOTD vai para STERR e acaba em / dev / null. Qualquer mensagem de erro AND padrão do comando remoto será mostrada (conforme vai para STDOUT)

Variante 1 - se você se importa com o status de saída do comando executado remotamente:

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 $?

Variante 2 - se você deseja ignorar o código de saída do comando remoto - basta executar true como o último comando remoto

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

Exemplos de mensagens de erro:

Exemplo 1:

ssh remotehost " falhou_command_remoto 2> & 1" 2> / dev / null || falha na conexão SSH do eco ou comando remoto retornado código de saída diferente de zero
 bash: failed_remote_command: comando não encontrado
Falha na conexão SSH ou no comando remoto - um deles retornou o código de saída diferente de zero 127

Exemplo 2:

ssh remotehost " falhou_command_remoto 2> & 1; true " 2> / dev / null || eco SSH conexão falhou
 bash: failed_remote_command: comando não encontrado

Exemplo 3a:

ssh remotehost " falhou_command_remoto 2> & 1; true" 2> / dev / null || falha na conexão SSH do eco
 # nenhuma mensagem é mostrada

Exemplo 3b:

ssh inexistentehost " falhou_commando remoto 2> & 1; true" 2> / dev / null || eco Conexão
 SSH falhou Conexão SSH falhou

0

Você já tentou remover o texto no arquivo motd? Apenas um pensamento.

Hint: /etc/motd

4
Ele disse do lado do cliente, a partir da criação PrintMotd a nenhum em sshd_config lado do servidor provavelmente seria melhor
Kyle Brandt

0

O que você está tentando fazer e por que o MoTD o incomoda? Eu estou supondo executar um comando remoto e analisar a saída? Nesse caso, isso pode ser feito de várias maneiras, sem chamar um shell interativo (que faz com que o motd seja mostrado).


Ah, como? Eu realmente prefiro usar o pensamento ssh ..
Rory

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.