İstemciden motd yazdırma ssh girişini durdur?


43

SSH şifresiz kurulum yaptım, ancak oturum açtığında MoTD'yi yazdırıyor. Bunu, müşteri tarafında olmasını engelleyen bir şey var mı?

Denedim ssh -qama bu işe yaramadı. Ben kullanmak istemiyorum ~/.hushloginne de ben kurmak sunucuyu değiştirmek istemiyorum. İşe yarayabilecek tek şey tüm çıktıları susturmak >/dev/null 2>&1. Ancak, aslında bir sorun olması durumunda hataları göz ardı etmek istemiyorum. Yapmak bile >/dev/nullişe yaramıyor, çünkü sshmotderi stderr'e basıyor gibi görünüyor.

Güncelleme & Akıl yürütme Bir cronda yedekleme yapıyorum. Bir hata oluşmadıkça cron e-postası almak istemiyorum. Ancak motd basılırsa her zaman bir e-posta alacağım.

Sakıncası basmaya devam etmek istiyorum çünkü bunun yasal etkileri var. Yetkili "izinsiz giriş yasak" diyor. İnsanların yasal olarak erişmelerini önlemek için bu tür bir ifadeye ihtiyacınız var (izinsiz giriş işareti gibi). Dolayısıyla, battaniyeyi her zaman devre dışı bırakmak istemiyorum.


1
Cron mesleği hakkında bazı detaylar ekleyebilir misin ...
Kyle Brandt

1
Motd yalnızca etkileşimli oturumlar için yazdırılır. Sadece test ettim ve öyle:> $ ssh ana bilgisayarı → MOTD baskılı> $ ssh ana bilgisayarı ls → sadece ana dizinin içeriğini yazdırır Başka bir deyişle, çok yanlış bir şey yapıyorsunuz; denedin mi
niXar,

Ayrıca, /etc/profile.dorada çalışan komut dosyalarının girişini kontrol etmek ve giriş sırasında konsola bir miktar çıktı almak için de dikkat çekicidir .
Dave

4
Gerçekten "izinsiz giriş yasak" demenizi gerektiren bir yasa var mı? DMCA'nın herhangi bir tür elektronik sistemi ( ne kadar az korunursa korursun ) kırmayı yasadışı kıldığını düşündüm , bu yüzden bir çeşit parola / SSH anahtarı gereksiniminiz olduğu sürece, bu saf vitrinlere benziyor.
Nick T,

Yanıtlar:


57

Bunu doğru yapmaktan neden hoşlandığınızı bilmiyorum - 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 dizinine ekleyin, böylece dosyayla yeni kullanıcı giriş dizinleri oluşturulur.

Güncelleme:

Yedek cron işiniz hakkında daha fazla bilgi olmadan, tek önerim komutun çıktısını bir dosyaya (veya cronun e-postayla yakalamasını) ve ssh oturumunun çıktısını / dev / null dizinine 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 uğraşmak zorunda kalacağım, ama bu başlamana sebep olacak.


3
"Doğru şekilde yapmak" hoşuma gidiyor.
Benoit

14
Sunucudan kaldırmak istemiyorum, çünkü yasal nedenlerden dolayı 'yetkili girişi yasaklanmış' bildirimini saklamam gerekiyor.
Rory

3
Fwiw, bildirim yetkisiz erişimi engellemiyor, yalnızca uygun bir yasal işlem yapabileceğinizi (ve yapacaklarını) ve telefon konuşmalarını kaydetme ile ilgili bildirimlerde olduğu gibi kullanımlarını izliyor olabilir.
jtimberman

Ayrıca, kullandığınız cron işini yapıştırırsanız çok yardımcı olur.
jtimberman

3
.hushlogingüzel
andrewtweber

15

Kullanıcı başına bunu istiyorsanız, sadece bir yapın touch ~/.hushloginve hepiniz OpenSSH ile ayarlayın.

Güncelleme : Başka bir yerde belirtildiği gibi, pam_motdkullanıcı başına kullanmayacak şekilde yapılandırılmış olabilir .hushlogin; kontrol /etc/login.defsiçin HUSHLOGIN_FILE. Tüm kullanıcıların listelenmiş /etc/hushloginsveya benzer şekilde olması için yapılandırılmış olabilir .


2
Bunu denedim, ama işe yaramadı. Diğerlerinin de belirttiği gibi, motif Pam'den basılmış olabilir
Rory

11

@ Not Tüm örnekler, bunun connectionStringgibi bir değişkene sahip olduğunuzu varsaymaktadır connectionString=user@server.

Çözüme Nasıl Ulaştım

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

ssh -T $connectionString "echo 'blah'"

Sorun, birçok komutu çalıştırmak için here-doc kullanmaya çalıştığınızda ortaya çıkar. Örneğin - feryat işe yaramayacak - günün mesajını yazacak (MoTD) ve ayrıca size "stdin: tty değil" gösterebilir.

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

Sorunu gidermek 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 karışık ...

Son çözüm

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

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

Örnekler

Bunu şöyle kullanın:

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

Veya öyle:

silentSsh $connectionString "echo 'blah'"

Veya öyle:

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

Veya bunun gibi:

silentSsh $connectionString < getlines.sh

Keşke bunun için daha fazla oy kullanabilseydim. Yapmamız gereken bazı over-ssh-scriptleri bulmakta çok yardımcı oldu.
csexton

Harika Cevap! Çok teşekkür ederim!!
Scottie H

10

Peki ya bu kesmek? ;-P

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

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

-TTty tahsisini devre dışı bırakmak için ssh'ye geçmek :

ssh -T machineName 'echo foo'

3
ssh user @ machine 'burada sizin komutunuz' yine de motd'i göstermiyor (etkileşimli bir kabuk değil).
Marie Fischer

Oh iyi, gelin ....
Kyle Brandt

ama ne demek istediğim "etkileşimli bir kabuk değil" demek ve kullanmaya başladığımdan beri komutları çalıştırabiliyorum-t
Ciasto piekarz

lütfen "-t" eklemenin davranışı değiştirdiğini unutmayın (TERM ayarlarınıza göre görüntülenir, gerektiğinde kontrol karakterleri ekler vb.). Bazı komutların sonuçlarını değiştirebilir (örnek için hatalar olabilir: ssh -t somehost "tar cf - bazı dosyalar"> local.tar # burada #t kullanmayın ... özellikle eğer bir unix ana bilgisayarı ssh kullanıyorsanız pencereler bir, ancak diğer durumlarda birçok sorun ortaya çıkabilir). Harika @StephaneChazelas cevabını görün: unix.stackexchange.com/questions/151916/…
Olivier Dulac 9

3

Hangi işletim sistemi bu? Bazı sistemlerde (ubuntu gibi) mot, ssh sunucusu (PrintMotd / etc / ssh / sshd_config içinde) tarafından değil, pam_motd ile pam tarafından basılır. Bu durumda, muhtemelen istemciden kontrol edemezsiniz.


ssh istemcisinde kontrol edemezsiniz, ancak kesinlikle müşteri tarafında kontrol edebilirsiniz :) .. ayrıntılar için cevabımı gör
drAlberT

Hayır, basılan paranın etrafında oldukça ilginç / zekice bir kesmeyi teklif ettiniz, sorusu müşteri tarafından basılmasını durduracak bir çözüm değil.
Theotherr,

2

Sunucuda yapmak zorundasın:

PrintMotd no
PrintLastLog no

Debian / ubtuntu'da pam_motd.so ile aynı çizgiyi gösterir:

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

Hayır yapmazsın. Aşağıdaki Kyle Brandt'ın cevabına bakınız.
Stobor

-1 - Cevap düzenlenmiş soruyu yansıtmaz. Artık alakalı değil.
romandas,

2

Ssh komutunu doğrudan cron ile çalıştırmayın.

Bunun yerine bir yardımcı bash betiği yapın , ssh işini yürütün ve gerekirse çıktıyı, hataları ve hata kodunu alın; sonunda istenmeyen dizeleri hata iletilerinden (durumunuzdaki MoTD) kaldırmak için bunları çözümleyin ve ardından bu şekilde elde ettiğiniz şeyi bash betiği çıktısına ve hata akışlarına yeniden yazdırın.

Daha sonra bu bash betiğini cron'a koyun ve mutlu yaşayın :)

Not: Bu genel bir çözümdür ve ssh ile yapmanız gereken iş ne olursa olsun çalışmak zorundadır. İhtiyaçlarınızı karşılaması gereken sadece müşteri tarafıdır ... müşterinin sunucu yapılandırmasına tek bağımlılığı, std err veya ssh istemcisinden kesmek istediğiniz tam mesaj bilgisidir.


2
Bu, geçici bir çözüm olan bir çözüm değildir.
niXar

Sana katılıyorum, üzgünüm. IMHO, işlerin net bir şekilde yapılması gerektiği gibi ... Ben açıkça ssh istemcisinin hareketi görmezden gelecek şekilde yapılandırmanın bir yolu olsaydı, sizinle aynı fikirdeydim, ancak var olamaz, çünkü sadece sshd kontrolü altında olmadığı için !
drAlberT

2

Sadece bir kısa not (eğer bunu bildirebilseydim bir yorum olurdu): Sisteme giriş yaptıktan sonra motd içeriği gösterilir . İnsanların yasal olarak bir kutuya erişmelerini engellemek istersem, bunu sshd_config'de bir "Banner" ile yapmayı tercih ederim. İçerik, Kullanıcı adı girildikten sonra ancak kimlik doğrulaması yapmadan önce görüntülenir.


4
evet, ancak ssh istemcisindeki -q
komutunu

1
Ah oğlum, tamamen görebiliyorum, "-q" Dynacorp Inc. için çalışan çatlak hukuk ekibinin tüm savunmasını yendi. Allah kahretsin! Bunun geldiğini görmemişlerdi. Gerçekçi ol. Afişi kasıtlı olarak görmesi gereken biri, onu kasten kaçarsa ... afiş hala bağlayıcıdır, çünkü onu kaçmak için bilmek zorunda kaldınız.
niXar,

2

Ya tanımladığın şeyi denemedin ya da sunucuların yanlış yapılandırılmış!

İşte RHEL5'te az önce denediğim şey:

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

İnteraktif olmayan mermilere gönderilmek için yasal uyarıya ihtiyacınız olmadığını sanmıyorum, değil mi? (Biri senin yaptığını iddia ederse, bana bir iyilik yap, onları fındıklara at.) Çünkü bu yüzden etkileşimli mermilerle etkileşimli olmayanlar arasında bir fark var.

Ancak her durumda, yaptığım işte, çünkü cron'dan gelen postaları sevmiyorum: Çıktıyı logger'a aktarıyorum. Sadece anlamsız feragatnamenizin ilk birkaç (3 diyelim) satırını kaldırmak için kuyruktan geçirin (test edilmemiş kod, senaryolarıma erişimim yok):

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

Sshd man'ına bakarsanız, şunu yazacağınızı görürsünüz: GİRİŞ SÜRECİ Bir kullanıcı başarıyla giriş yaptığında, sshd aşağıdakileri yapar: 1. Oturum açma bir tty ise ve hiçbir komut belirtilmemişse, son giriş zamanı yazdırılır ve / etc / motd (yapılandırma dosyasında veya ~ / .hushlogin tarafından engellenmediği sürece; FILES bölümüne bakın). 2. ... ssh
girişinde

Biliyorum, gösterdiğim de buydu. Ne demek istiyorsun?
niXar,

1

Seni anlarsam, başka nedenlerden dolayı dürtüye ihtiyacın var ama yedekleme için de hele ihtiyacın yok. Sshd yapılandırmalarında yalnızca global olarak kullanıcı bazında ayarlanamaz. Bu nedenle, müşteri tarafında basit baskıyı çözmeniz gerekir. Ancak motd'ın 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 yarattığım tek çözüm, daha sonra motd'inkiyi filtrelemek. Yazılımın mesajlarını değiştirmek zor olduğu için motd'ın 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 ***

O zaman çerçeve arasındaki metni filtrelemeli ve bırakmalısınız.


1

BURADA ÇÖZÜM:

Sunucunun sorumlusu değilseniz ve motd veya sshd config komutunu değiştiremezseniz, aşağıdaki gibi bir komut kullanın:

Uzaktan kumanda (lar) için STDERR'i STDOUT'a yönlendir, böylece göreceksiniz. Sonra ssh'nin STDERR kodunu / dev / null dizinine yönlendirin. MOTD STERR'e gider ve / dev / null ile biter. Uzak komuttaki herhangi bir standart VE hata mesajı gösterilecektir (STDOUT'a giderken)

Değişke 1 - uzaktan yürütülen komutun çıkış durumunu düşünüyorsanı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 $?

Değişke 2 - eğer uzak komutun çıkış kodunu yoksaymak istiyorsan - sadece son uzak komut olarak çalıştır

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

Hata mesajı örnekleri:

Örnek 1:

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

Örnek 2:

ssh remotehost " fail_ remote_command 2> & 1; true " 2> / dev / null || echo SSH bağlantısı başarısız
 bash: fail_remote_command: komut bulunamadı

Örnek 3a:

ssh remotehost " fail_ remote_command 2> & 1; true" 2> / dev / null || yankı SSH bağlantısı başarısız
 # mesaj gösterilmez

Örnek 3b:

ssh nonexistinghost " fail_ remote_command 2> & 1; true" 2> / dev / null || yankı SSH bağlantısı başarısız
 SSH bağlantısı başarısız oldu

0

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

Hint: /etc/motd

4
Müşteri tarafında, sunucu tarafında PrintMotd ayarının sshd_config'te no olarak ayarlanması muhtemelen daha iyi olacağını söyledi
Kyle Brandt

0

Ne yapmaya çalışıyorsunuz ve MoTD neden sizi rahatsız ediyor? Uzak bir komut çalıştırmayı ve çıktıyı ayrıştırmayı mı tahmin ediyorum? Eğer öyleyse, bu etkileşimli bir kabuğu çağırmadan çeşitli şekillerde yapılabilir (bu, hareketin gösterilmesine neden olur).


Ah, Mesela? Gerçekten ssh düşünce kullanmayı tercih ederim ..
Rory

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.