Hentikan login ssh dari mencetak motd dari klien?

44

Saya sudah menyiapkan SSH tanpa kata sandi, namun ia mencetak MoTD ketika login. Apakah ada cara untuk menghentikan hal itu terjadi dari sisi klien?

Saya sudah mencoba ssh -qtetapi itu tidak berhasil. Saya tidak ingin menggunakan ~/.hushloginatau ingin mengubah pengaturan server. Satu-satunya hal yang dapat bekerja adalah untuk menenangkan semua output, dengan >/dev/null 2>&1. Namun, saya tidak ingin mengabaikan kesalahan kalau-kalau ada masalah. Bahkan melakukan >/dev/nulltidak berhasil, karena sshsepertinya mencetak motd ke stderr.

Perbarui & alasan Saya menjalankan cadangan di cron. Saya tidak ingin mendapatkan email cron kecuali ada kesalahan. Namun jika motd dicetak saya akan mendapatkan email setiap saat.

Saya ingin menjaga motd dicetak karena itu memiliki implikasi hukum. Motd mengatakan "akses tidak terdaftar dilarang". Anda perlu memiliki pernyataan semacam ini di sana untuk secara hukum mencegah orang mengaksesnya (seperti tanda tidak masuk tanpa izin). Karenanya saya tidak ingin selimut menonaktifkannya sepanjang waktu.

Rory
sumber
1
Anda dapat menambahkan beberapa rincian tentang tugas cron ...
Kyle Brandt
1
Motd hanya dicetak untuk sesi interaktif. Saya baru saja mengujinya, dan memang demikian:> $ ssh host → MOTD printed> $ ssh host ls → hanya mencetak konten direktori home Dengan kata lain, Anda melakukan sesuatu yang sangat salah; apakah kamu sudah mencoba?
niXar
Perlu juga dicatat untuk memeriksa /etc/profile.dskrip yang mungkin berjalan di sana dan mencetak beberapa output ke konsol saat login.
Dave
4
Apakah memang ada undang-undang yang mengharuskan Anda untuk mengatakan "akses tidak sah dilarang"? Saya pikir DMCA membuatnya ilegal untuk memutuskan segala jenis sistem elektronik ( tidak peduli seberapa buruk terlindungi ), jadi selama Anda memiliki semacam persyaratan sandi / kunci SSH, ini seperti ganti jendela murni.
Nick T

Jawaban:

58

Saya tidak yakin mengapa Anda tidak suka melakukan ini dengan benar - baik di server a la

PrintMotd no
PrintLastLog no

dan

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

Atau menambahkan ~ / .hushlogin untuk setiap pengguna.

Petunjuk, untuk ~ / .hushlogin, tambahkan ke / etc / skel sehingga direktori home pengguna baru dibuat dengan file tersebut.

Memperbarui:

Tanpa informasi lebih lanjut tentang pekerjaan cron cadangan Anda, satu-satunya saran saya adalah mengarahkan kembali output perintah ke file (atau membiarkan cron menangkapnya dalam email) dan output dari sesi ssh ke / dev / null. Sesuatu seperti:

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

Atau

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

Saya harus bermain-main dengan perintah sedikit, tetapi itu harus Anda mulai.

jtimberman
sumber
3
Saya suka "melakukan dengan benar".
Benoit
14
Saya tidak ingin menghapusnya dari server karena saya perlu menyimpan pemberitahuan 'akses resmi dilarang' di sana untuk alasan hukum.
Rory
3
Namun, pemberitahuan itu tidak mencegah akses yang tidak sah, itu hanya memberi tahu orang-orang bahwa Anda dapat (dan akan) mengambil tindakan hukum yang sesuai, dan mungkin memantau penggunaannya, seperti halnya pemberitahuan tentang merekam percakapan telepon.
jtimberman
Juga, akan sangat membantu jika Anda menempelkan tugas cron yang Anda gunakan.
jtimberman
3
.hushloginbagus
andrewtweber
16

Jika Anda menginginkan ini berdasarkan per pengguna, lakukan saja touch ~/.hushlogindan Anda sudah siap dengan OpenSSH.

Pembaruan : Seperti yang ditunjukkan di tempat lain, pam_motddapat dikonfigurasi untuk tidak menggunakan per-pengguna .hushlogin; periksa /etc/login.defsuntuk HUSHLOGIN_FILE. Mungkin dikonfigurasikan agar semua pengguna terdaftar /etc/hushloginsatau serupa.

towo
sumber
2
Saya mencobanya, tetapi tidak berhasil. Seperti yang telah ditunjukkan orang lain, motd mungkin dicetak dari pam
Rory
11

@catatan Semua contoh menganggap Anda telah menetapkan variabel connectionStringdengan sesuatu seperti connectionString=user@server.

Bagaimana saya dapat solusinya

Penggunaan ssh -Tharus bekerja untuk perintah sederhana. Misalnya ini tidak mencetak informasi tambahan:

ssh -T $connectionString "echo 'blah'"

Masalahnya adalah ketika Anda mencoba menggunakan di sini-doc untuk menjalankan banyak perintah. Sebagai contoh - di bawah ini TIDAK akan berfungsi - itu akan menggemakan pesan hari ini (MoTD) dan juga mungkin menunjukkan kepada Anda "stdin: is not a tty".

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

Untuk mengatasi masalah ini, Anda harus terlebih dahulu menyimpan perintah ke variabel lokal dan mengirimkannya ke server jauh.

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

Tapi itu berantakan ...

Solusi akhir

Buat fungsi universal (perhatikan bahwa ia dapat mengambil string atau HEREDOC sebagai perintah).

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

Contohnya

Gunakan ini seperti ini:

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

Atau seperti itu:

silentSsh $connectionString "echo 'blah'"

Atau seperti itu:

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

Atau bahkan seperti itu:

silentSsh $connectionString < getlines.sh
Nux
sumber
Saya berharap saya memiliki lebih banyak suara positif untuk ini. Sangat membantu dalam mencari tahu beberapa scripting over-ssh yang perlu kita lakukan.
csexton
Jawaban Fantastis !! Terima kasih banyak!!
Scottie H
10

Bagaimana dengan retas ini? ;-P

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

Berikut ini tidak valid:

Beralih -Tke ssh untuk menonaktifkan alokasi tty:

ssh -T machineName 'echo foo'
Kyle Brandt
sumber
3
ssh user @ machine 'perintah Anda di sini' toh tidak menunjukkan motd (itu bukan shell interaktif).
Marie Fischer
Oh bagus, tunjukkan ....
Kyle Brandt
tapi apa artinya "itu bukan shell interaktif" sejak saya mencoba dan saya dapat menjalankan perintah apa yang akan saya lewatkan menggunakan-t
Ciasto piekarz
harap dicatat bahwa menambahkan "-t" mengubah perilaku (ini ditampilkan sesuai dengan pengaturan TERM Anda, menambahkan karakter kontrol bila diperlukan, dll). Itu dapat mengubah hasil dari beberapa perintah (itu bisa untuk contoh memperkenalkan kesalahan di: ssh -t somehost "tar cf - some files"> local.tar # JANGAN gunakan -t di sini ... terutama jika Anda ssh host unix dari satu windows satu, tetapi banyak masalah lain mungkin muncul dalam kasus lain). Lihat jawaban @StephaneChazelas yang luar biasa: unix.stackexchange.com/questions/151916/…
Olivier Dulac
3

Sistem operasi apa ini? Pada beberapa sistem (seperti ubuntu) motd tidak dicetak oleh server ssh (PrintMotd di / etc / ssh / sshd_config), tetapi oleh pam dengan pam_motd. Jika ini masalahnya, Anda mungkin tidak dapat mengendalikannya dari klien.

theecereceive
sumber
Anda tidak dapat mengontrolnya di klien ssh, tetapi Anda dapat yakin di sisi klien :) .. lihat jawaban saya untuk detailnya
drAlberT
Tidak, Anda telah mengusulkan hack yang cukup menarik / pintar di sekitar motd yang sedang dicetak, bukan solusi untuk menghentikannya dicetak oleh klien, yang merupakan pertanyaan.
theotherreceive
2

Anda harus melakukannya di server:

PrintMotd no
PrintLastLog no

Pada debian / ubtuntu juga hash baris dengan pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so
ThorstenS
sumber
Tidak, kamu tidak. Lihat jawaban Kyle Brandt di bawah ini.
Stobor
-1 - Jawaban tidak mencerminkan pertanyaan yang diedit. Tidak lagi relevan.
Romandas
2

Jangan jalankan perintah ssh secara langsung oleh cron.

Sebagai gantinya, buat skrip bash pembantu , jalankan pekerjaan ssh dan ambil output, kesalahan, dan kode kesalahan jika diperlukan; akhirnya mengurai mereka untuk menghapus string yang tidak diinginkan dari pesan kesalahan (MoTD dalam kasus Anda) dan kemudian mencetak kembali pada output skrip bash dan stream stream apa yang telah Anda peroleh sedemikian rupa.

Daripada menempatkan skrip bash ini di cron dan hidup bahagia :)

Catatan: Ini adalah solusi umum, dan harus bekerja apa pun pekerjaan yang harus Anda lakukan melalui ssh. Hanya sisi klien juga, yang harus memenuhi kebutuhan Anda ... satu-satunya ketergantungan klien pada konfigurasi server adalah pengetahuan tentang pesan yang tepat yang ingin Anda hilangkan dari std err atau di luar ssh client

drAlberT
sumber
2
Itu bukan solusi yang merupakan solusi.
niXar
Saya tidak bisa setuju dengan Anda, maaf. IMHO itu cara hal-hal yang harus dilakukan dengan bersih ... Saya setuju dengan Anda jika ada cara untuk secara eksplisit mengkonfigurasi ssh client untuk mengabaikan motd, tetapi tidak dapat ada, hanya karena tidak di bawah kendali sshd !
drAlberT
2

Hanya sidenote (akan menjadi komentar, jika saya bisa memposting itu): Isi motd ditampilkan setelah berhasil login ke sistem. Jika saya ingin secara hukum mencegah orang mengakses kotak, saya lebih suka melakukannya dengan "Spanduk" di sshd_config. Konten ditampilkan setelah memasukkan Nama Pengguna tetapi sebelum diautentikasi.


sumber
4
ya, tapi Anda dapat menonaktifkan banner menggunakan q pada klien ssh, jadi saya tidak bisa setuju dengan catatan Anda
drAlberT
1
Oh nak, aku benar-benar bisa melihatnya, "-q" mengalahkan seluruh pertahanan tim legal crack yang bekerja untuk Dynacorp Inc. Astaga! Mereka belum melihatnya datang. Sadarlah. Jika seseorang yang seharusnya melihat spanduk sengaja menghindarinya ... spanduk itu masih mengikat, karena Anda harus mengetahuinya untuk menghindarinya.
niXar
2

Entah Anda belum mencoba apa yang Anda gambarkan, atau server Anda salah dikonfigurasi!

Inilah yang saya coba di 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 ~ $ 

Saya kira Anda tidak perlu penafian untuk dikirim ke cangkang non-interaktif, bukan? (Jika ada yang mengklaim Anda melakukannya, bantu saya, tendang mereka.) Karena itulah mengapa ada perbedaan antara cangkang interaktif dan yang tidak interaktif.

Tapi bagaimanapun, inilah yang saya lakukan karena saya tidak suka mail dari cron: Saya menyalurkan output ke logger. Cukup pipirkan melalui ekor untuk menghapus beberapa baris pertama (misalkan 3) dari disclaimer Anda yang tidak berguna seperti itu (kode yang belum diuji, saya tidak memiliki akses ke skrip saya):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
niXar
sumber
Jika Anda melihat di man sshd, Anda akan melihat bahwa dikatakan: PROSES LOGIN Ketika seorang pengguna berhasil login, sshd melakukan hal berikut: 1. Jika login menggunakan tty, dan tidak ada perintah yang ditentukan, cetak waktu login terakhir dan / etc / motd (kecuali dicegah dalam file konfigurasi atau oleh ~ / .hushlogin; lihat bagian FILES). 2. ... Perhatikan bahwa jika perintah dimasukkan direktori dalam login ssh, tidak ada MOTD ditampilkan
katriel
Saya tahu, itulah yang saya tunjukkan. Apa maksudmu
niXar
1

Jika saya mengerti Anda, Anda perlu motd untuk alasan lain tetapi tidak perlu motd untuk cadangan. Dalam konfigurasi sshd tidak dapat mengaturnya hanya berdasarkan pengguna secara global. Oleh karena itu Anda perlu menyelesaikan penekanan berat di sisi klien. Tetapi tidak ada perbedaan antara teks motd dan pesan kesalahan perangkat lunak cadangan. Keduanya adalah teks di terminal. Satu-satunya solusi yang saya lihat untuk membuat perbedaan antara dua pesan ini kemudian menyaring satu motd. Karena pesan perangkat lunak sulit diubah, saya sarankan untuk memodifikasi teks motd. Misalnya menaruh bingkai di sekitar:

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

motd message

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

Maka Anda harus menyaring teks di antara bingkai dan menjatuhkannya.

Saabi
sumber
1

SOLUSI DI SINI:

Jika Anda tidak bertanggung jawab atas server dan Anda tidak dapat mengubah konfigurasi motd atau sshd, gunakan perintah seperti berikut:

Redirect STDERR ke STDOUT untuk perintah jarak jauh sehingga Anda akan melihatnya. Dan kemudian mengarahkan STDERR dari ssh ke / dev / null. MOTD pergi ke STERR dan berakhir di / dev / null. Pesan standar DAN kesalahan dari perintah jarak jauh akan ditampilkan (seperti yang terjadi pada STDOUT)

Varian 1 - jika Anda peduli tentang status keluar dari perintah yang dijalankan dari jarak jauh:

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

Varian 2 - jika Anda ingin mengabaikan kode keluar dari perintah jarak jauh - jalankan benar sebagai perintah jarak jauh terakhir

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

Contoh pesan kesalahan:

Contoh 1:

ssh remotehost " gagal_ remote_command 2> & 1" 2> / dev / null || gema koneksi SSH gagal atau perintah jarak jauh mengembalikan kode keluar non-nol
 bash: gagal_remote_command: perintah tidak ditemukan
Sambungan SSH atau perintah jarak jauh gagal - salah satunya mengembalikan kode keluar non-nol 127

Contoh 2:

ssh remotehost " gagal_ remote_command 2> & 1; true " 2> / dev / null || gema koneksi SSH gagal
 bash: gagal_remote_command: perintah tidak ditemukan

Contoh 3a:

ssh remotehost " gagal_ remote_command 2> & 1; true" 2> / dev / null || koneksi SSH gema gagal
 # tidak ada pesan yang ditampilkan

Contoh 3b:

ssh nonexistinghost " gagal_ remote_command 2> & 1; true" 2> / dev / null || koneksi SSH echo gagal
 Koneksi SSH gagal
Chris
sumber
0

Sudahkah Anda mencoba menghapus teks dalam file motd? Hanya pemikiran saja.

Hint: /etc/motd
Joseph Kern
sumber
4
Dia mengatakan dari sisi klien, dari sisi server pengaturan PrintMotd tidak ada di sshd_config mungkin akan lebih baik
Kyle Brandt
0

Apa yang Anda coba lakukan dan mengapa MoTD mengganggu Anda? Saya menduga menjalankan perintah jarak jauh dan mem-parsing output? Jika demikian, ini dapat dilakukan dengan berbagai cara tanpa menggunakan shell interaktif (yang menyebabkan motd ditampilkan).

Marie Fischer
sumber
Oh, seperti apa? Aku benar-benar suka menggunakan pemikiran ssh ..
Rory