Interrompe o login do ssh de imprimir o motd do cliente?

40

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

Eu tentei ssh -q , mas isso não funciona. Eu não quero usar ~/.hushlogin nem eu quero mudar o servidor configurado. A única coisa que pode funcionar é acalmar todas as saídas, com >/dev/null 2>&1 . No entanto, não quero ignorar os erros, caso haja um problema. Mesmo fazendo >/dev/null não funciona, pois ssh parece imprimir o texto para o stderr.

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

Eu quero manter o texto 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 que as pessoas acessem o site (como um sinal que não ultrapasse o limite). Por isso não quero desabilitar o tempo todo.

    
por Rory 06.07.2009 / 15:22

14 respostas

51

Não sei por que você tem aversão a fazer isso corretamente - seja 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 a / etc / skel para que os diretórios iniciais dos novos usuários sejam criados com o arquivo.

Atualização:

Sem mais informações sobre sua tarefa cron de backup, minha única sugestão é redirecionar a saída do comando para um arquivo (ou permitir que o cron o capture no 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 começar.

    
por 09.07.2009 / 08:56
14

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

Atualização : como apontado em outro lugar, pam_motd pode ser configurado para não usar um usuário .hushlogin ; verifique /etc/login.defs para HUSHLOGIN_FILE . Pode ser configurado para ter todos os usuários listados em /etc/hushlogins ou similar.

    
por 06.07.2009 / 19:45
10

Que tal esse truque? ;-P

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

O seguinte é não válido:

Passando -T para ssh para desabilitar a alocação de tty:

ssh -T machineName 'echo foo'
    
por 06.07.2009 / 15:30
7

@note Todos os exemplos presumem que você tenha definido uma variável connectionString com algo como connectionString=user@server .

Como cheguei à solução

Usar ssh -T deve 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 irá funcionar - irá 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 contornar o problema, primeiro você precisa salvar os comandos na variável local e enviá-los para o servidor remoto.

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

Mas isso é confuso ...

Solução final

Faça uma função universal (note que ele pode usar 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 assim:

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 até mesmo assim:

silentSsh $connectionString < getlines.sh
    
por 17.03.2016 / 17:10
3

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

    
por 06.07.2009 / 15:33
3

Você não tentou o que está descrevendo ou seus servidores estão incorretos!

Veja o que acabei de testar 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 ~ $ 

Eu não suponho que você precise que o aviso seja enviado para shells não interativos, não é? (Se alguém disser que você faz, me faça um favor, dê um chute neles.) 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. Simplesmente canalize-o pela cauda para remover as primeiras (digamos, 3) linhas do seu disclaimer inútil (código não testado, eu 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
    
por 09.08.2009 / 02:42
2

Você precisa fazer isso no servidor:

PrintMotd no
PrintLastLog no

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

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so
    
por 06.07.2009 / 18:10
2

Não execute o comando ssh diretamente pelo cron.

Crie um script auxiliar , executando o trabalho ssh e recuperando a saída, os erros e o código de erro, se necessário; eventualmente, analise-os para remover strings indesejadas de mensagens de erro (o MoTD no seu caso) e então imprima na saída do script bash e nos streams de erro o que você obteve dessa maneira.

De colocar este script bash no cron e viver feliz:)

Nota: Esta é uma solução geral e tem que funcionar, qualquer que seja o trabalho que você tenha que executar via ssh. É apenas do lado do cliente também, o que deve satisfazer suas necessidades ... a única dependência do cliente na configuração do servidor é o conhecimento da mensagem exata que você deseja cortar do std err ou do cliente ssh

    
por 06.08.2009 / 09:04
2

Apenas um sidenote (teria sido um comentário, se eu pudesse postar isso): Os conteúdos do motd são mostrados após login com sucesso no sistema. Se eu quiser legalmente impedir que as pessoas acessem uma caixa, prefiro fazer isso por um "Banner" em sshd_config. O conteúdo é exibido depois de digitar o nome de usuário, mas antes de autenticar.

    
por 06.08.2009 / 19:01
1

Se eu entendi você, você precisa de motd por outros motivos, mas não precisa de autorização para backup. Na configuração do sshd não pode configurá-lo por usuário apenas globalmente. Portanto, você precisa resolver a supressão 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 a diferença entre essa mensagem é filtrar a mensagem da mota. 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 ***

Em seguida, você deve filtrar o texto entre o quadro e soltá-lo.

    
por 06.08.2009 / 05:44
1

SOLUÇÃO AQUI:

Caso você não esteja no comando do servidor e não possa alterar a configuração do motd ou do sshd, use o seguinte comando:

Redirecione STDERR para STDOUT para comando (s) remoto (s) para que você o veja. E, em seguida, redirecione STDERR de ssh para / dev / null. O MOTD vai para o STERR e acaba em / dev / null. Qualquer mensagem de erro E padrão do comando remoto será mostrada (como 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ê quiser ignorar o código de saída do comando remoto - execute 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 "failed_remote_command 2>&1" 2>/dev/null || echo SSH connection failed or remote command returned non-zero exit code
bash: failed_remote_command: command not found
SSH connection or remote command failed - either of them returned non-zero exit code 127

Exemplo 2:

ssh remotehost "failed_remote_command 2>&1; true" 2>/dev/null || echo SSH connection failed
bash: failed_remote_command: command not found

Exemplo 3a:

ssh remotehost "failed_remote_command 2>&1; true" 2>/dev/null || echo SSH connection failed
# no message is shown

Exemplo 3b:

ssh nonexistinghost "failed_remote_command 2>&1; true" 2>/dev/null || echo SSH connection failed
SSH connection failed
    
por 01.04.2011 / 09:51
0

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

Hint: /etc/motd
    
por 06.07.2009 / 15:23
0

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

    
por 06.07.2009 / 17:37
0

Você já tentou usar uma configuração de subsistema ssh? Você pode encontrar um exemplo no link que inclui até mesmo o backup de arquivos.

    
por 09.08.2009 / 03:30