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.
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.
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.
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.
@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
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'
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.
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.
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
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
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
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.
Motd dosyasındaki metni kaldırmayı denediniz mi? Sadece bir düşünce.
Hint: /etc/motd
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).
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.