it-swarm.asia

Ssh giriş istemciden motd yazdırmak durdurmak?

SSH şifresiz kurulumum var, ancak oturum açtığında MoTD'yi yazdırıyor. İstemci tarafından bunun olmasını durdurmak için yine de var mı?

ssh -q 'I denedim ancak bu işe yaramıyor. Ne ~/.hushlogin Kullanmak istemiyorum ne de sunucu kurulumunu değiştirmek istiyorum. Çalışabilecek tek şey, >/dev/null 2>&1 İle tüm çıktıları susturmaktır. Ancak, aslında bir sorun olması durumunda hataları görmezden gelmek istemiyorum. ssh motd'yi stderr'a yazdırdığı için >/dev/null Bile çalışmaz.

Güncelleme ve akıl yürütme Yedeklemeyi bir cronda çalıştırıyorum. Bir hata oluşmadıkça bir cron e-postası almak istemiyorum. Ancak motd yazdırılırsa her zaman bir e-posta alırım.

Motd yazdırılmaya devam etmek istiyorum çünkü bunun yasal sonuçları var. Motd "izinsiz erişim yasak" diyor. İnsanların buna erişmesini yasal olarak önlemek için bu tür bir ifadeye sahip olmanız gerekir (izinsiz giriş işareti gibi). Bu yüzden her zaman battaniyeyi devre dışı bırakmak istemiyorum.

45
Rory

Bunu doğru yapmak için neden bir isteksizlik olduğundan emin değilim - ya sunucuda

PrintMotd no
PrintLastLog no

ve

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

Veya her kullanıcı için ~/.hushlogin ekleyerek.

İpucu, ~/.hushlogin için,/etc/skel dosyasına ekleyin, böylece dosyayla yeni kullanıcı ana dizinleri oluşturulur.

Güncelleme:

Yedek cron işiniz hakkında daha fazla bilgi olmadan, diğer tek önerim, komutun çıktısını bir dosyaya (veya cronun e-postada yakalamasına izin ver) ve ssh oturumunun çıktısını/dev/null'a yönlendirmektir. Gibi bir şey:

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

Veya

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

Komutlarla biraz oynamak zorunda kalırdım, ama bu seni başlatacak.

58
jtimberman

Bunu her kullanıcı için ayrı ayrı istiyorsanız, bir touch ~/.hushlogin ve hepiniz OpenSSH ile hazırsınız.

Güncelleme: Başka bir yerde belirtildiği gibi, pam_motd, kullanıcı başına kullanılmayacak şekilde yapılandırılabilir .hushlogin; Kontrol /etc/login.defs için HUSHLOGIN_FILE. Tüm kullanıcıların /etc/hushlogins veya benzeri.

16
towo

@note Tüm örnekler, [email protected] gibi bir şeyle connectionString değişkeni ayarladığınızı varsayar.

Çözüme nasıl ulaştım

ssh -T Kullanımı basit komutlar için çalışmalıdır. Örneğin, bu ek bilgi yazdırmaz:

ssh -T $connectionString "echo 'blah'"

Sorun, burada-doc birçok komut çalıştırmak için kullanmaya çalıştığınızdadır. Örneğin - feryat çalışmaz - günün mesajını (MoTD) yansıtır ve size "stdin: tty değildir" gösterebilir.

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

Bu sorunu çözmek için önce komutları yerel değişkene kaydetmeniz ve uzak sunucuya göndermeniz gerekir.

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

Ama bu dağınık ...

Nihai çözüm

Evrensel bir işlev yapın (komut olarak bir dize veya HEREDOC alabileceğini unutmayın).

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

Örnekler

Bunu şu şekilde kullanın:

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

Veya böyle:

silentSsh $connectionString "echo 'blah'"

Veya böyle:

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

Hatta şöyle:

silentSsh $connectionString < getlines.sh
11
Nux

Bu saldırıya ne dersin? ;-P

ssh -t [email protected] '/bin/bash'

Aşağıdakiler değil geçerli:

Geçen -T ile ssh arasında tty ayırmayı devre dışı bırakın:

ssh -T machineName 'echo foo'
10
Kyle Brandt

Bu hangi işletim sistemi? Bazı sistemlerde (ubuntu gibi) motd ssh sunucusu (PrintMotd in/etc/ssh/sshd_config) tarafından değil, pam_motd içeren pam tarafından yazdırılmaz. Bu durumda, büyük olasılıkla istemciden kontrol edemezsiniz.

3
theotherreceive

Ssh komutunu doğrudan cron ile yürütmeyin.

Bir yardımcı bash betiği oluşturun bunun yerine, ssh işini yürütmek ve gerekirse çıktıyı, hataları ve hata kodunu almak; sonunda hata mesajlarından (sizin durumunuzdaki MoTD) istenmeyen dizeleri kaldırmak için bunları ayrıştırın ve daha sonra bu şekilde elde ettiğiniz şeyi bash script çıktısına ve hata akışlarına yeniden yazdırın.

Bu bash betiğini cron'a koy ve mutlu yaşa :)

Not: Bu genel bir çözümdür ve ssh aracılığıyla gerçekleştirmeniz gereken iş ne olursa olsun çalışmak zorundadır. İhtiyaçlarınızı karşılaması gereken sadece istemci tarafıdır ... istemcinin sunucu yapılandırmasına tek bağımlılığı, std err'den veya ssh istemcisinden kesmek istediğiniz kesin mesajın bilgisidir.

2
drAlberT

Bunu sunucuda yapmanız gerekir:

PrintMotd no
PrintLastLog no

Debian/ubtuntu'da ayrıca pam_motd.so ile satır hash:

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

Açıkladığınız şeyi denemediniz veya sunucularınız yanlış yapılandırılmış!

İşte RHEL5'te denediklerim:

workstation ~ $ ssh [email protected]
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh [email protected]
MOTD
server ~ # ^D
workstation ~ $ ssh [email protected] echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

Etkileşimli olmayan mermilere gönderilmek için feragatnameye ihtiyacınız olduğunu düşünmüyorum, değil mi? (Eğer biri iddia ettiğinde, bana bir iyilik yap, onları çıldır.) Çünkü tam da bu yüzden interaktif mermilerle interaktif olmayan mermiler arasında bir ayrım var.

Ama her durumda, işte yaptığım şey çünkü cron'dan posta sevmiyorum: Çıktıyı logger'a bağlıyorum. Sadece anlamsız yasal uyarının ilk birkaç (diyelim ki 3) satırını (denenmemiş kod, komut dosyalarıma erişemiyorum) kaldırmak için kuyruğa geçirin:

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

BURADA ÇÖZÜM:

Sunucudan sorumlu değilseniz ve motd veya sshd config'i değiştiremiyorsanız, aşağıdaki gibi komutu kullanın:

Görmeniz için uzak komut (lar) için STDERR'ı STDOUT'a yönlendirin. Ve sonra STDR ssh'yi/dev/null konumuna yönlendirin. MOTD, STERR'a gider ve/dev/null olarak sona erer. Uzak komuttan herhangi bir standart VE hata mesajı gösterilecektir (STDOUT'a giderken)

Varyant 1 - Uzaktan yürütülen komutun çıkış durumunu önemsiyorsanız:

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

Varyant 2 - uzaktan komutun çıkış kodunu yoksaymak istiyorsanız - son uzaktan komut olarak true komutunu çalıştırın

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

Hata mesajı örnekleri:

Örnek 1:

 ssh remotehost "başarısız oldu_remote_command 2> & 1 "2>/dev/null || echo SSH bağlantısı başarısız oldu veya uzaktan komut sıfırdan farklı çıkış kodu döndürdü 
bash: fail_remote_command: komut bulunamadı 
 SSH bağlantısı veya uzaktan komut başarısız - ikisi sıfır olmayan çıkış kodu döndürdü 127

Örnek 2:

 ssh remotehost "başarısız oldu_remote_command 2> & 1; doğru"2>/dev/null || echo SSH bağlantısı başarısız oldu 
bash: fail_remote_command: komut bulunamadı

Örnek 3a:

 ssh remotehost "başarısız oldu_remote_command 2> & 1; gerçek "2>/dev/null || echo SSH bağlantısı başarısız oldu 
# mesaj gösterilmiyor

Örnek 3b:

 SSH nonexistinghost "başarısız oldu_remote_command 2> & 1; gerçek "2>/dev/null || echo SSH bağlantısı başarısız oldu 
SSH bağlantısı başarısız oldu
1
Chris

Seni anlarsam, başka nedenlerden dolayı motd'ye ihtiyacın var ama yedekleme için motd'ye ihtiyacın yok. Sshd yapılandırmasında kullanıcı tarafından sadece global olarak kurulamaz. Bu nedenle müşteri tarafında motd supresyonunu çözmeniz gerekir. Ancak motd metni ile yedekleme yazılımının hata mesajları arasında fark yoktur. Her ikisi de terminaldeki metindir. Bu iki mesaj arasında fark yaratmak için gördüğüm tek çözüm motd'un mesajını filtrelemek. Yazılımın mesajlarını değiştirmek zor olduğundan motd metnini değiştirmenizi öneririm. Örneğin, etrafına bir çerçeve yerleştirin:

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

motd message

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

Ardından metni çerçeve arasında filtrelemeli ve bırakmalısınız.

1
Saabi

Motd dosyasındaki metni kaldırmayı denediniz mi? Sadece bir düşünce.

Hint: /etc/motd
0
Joseph Kern

Ne yapmaya çalışıyorsunuz ve MoTD sizi neden rahatsız ediyor? Uzak bir komut yürütme ve çıktı ayrıştırma tahmin? Eğer öyleyse, bu etkileşimli bir Kabuk çağırmadan çeşitli yollarla yapılabilir (bu da motdun gösterilmesine neden olur).

0
Marie Fischer

Bir ssh alt sistemi yapılandırması kullanmayı denediniz mi? Dosyaları yedeklemeyi bile içeren http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm adresinde bir örnek bulabilirsiniz.

0
David