it-swarm-id.com

Hentikan login ssh dari mencetak motd dari klien?

Saya memiliki pengaturan 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 -q tapi itu tidak berhasil. Saya tidak ingin menggunakan ~/.hushlogin saya juga tidak 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/null tidak berfungsi, karena ssh tampaknya mencetak motd ke stderr.

Perbarui & alasan Saya menjalankan cadangan di cron. Saya tidak ingin mendapatkan email cron kecuali terjadi 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.

45
Rory

Saya tidak yakin mengapa Anda enggan 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.

58
jtimberman

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

Pembaruan: Seperti yang ditunjukkan di tempat lain, pam_motd dapat dikonfigurasi untuk tidak menggunakan per pengguna .hushlogin; periksa /etc/login.defs untuk HUSHLOGIN_FILE. Mungkin dikonfigurasikan agar semua pengguna terdaftar di /etc/hushlogins atau serupa.

16
towo

@catatan Semua contoh menganggap Anda telah menetapkan variabel connectionString dengan sesuatu seperti [email protected].

Bagaimana saya sampai pada solusinya

Menggunakan ssh -T harus 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. Misalnya - 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 mengatasinya, 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 itu 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"
}

Contoh

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
11
Nux

Bagaimana dengan retas ini? ;-P

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

Berikut ini adalah tidak valid:

Lulus -T to ssh untuk menonaktifkan alokasi tty:

ssh -T machineName 'echo foo'
10
Kyle Brandt

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 demikian, Anda mungkin tidak dapat mengendalikannya dari klien.

3
theotherreceive

Jangan jalankan perintah ssh langsung oleh cron.

Buat skrip bash pembant sebagai gantinya, 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

2
drAlberT

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
2
ThorstenS

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

Inilah yang saya coba di RHEL5:

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

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.

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

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

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 remote mengembalikan kode keluar non-nol 
bash: gagal_remote_command: perintah tidak ditemukan 
 Sambungan SSH atau perintah jarak jauh gagal - salah satu dari mereka mengembalikan kode keluar non-nol 127

Contoh 2:

 ssh remotehost "gagal_remote_command 2> & 1; benar"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 || echo, koneksi SSH gagal 
# tidak ada pesan yang ditampilkan

Contoh 3b:

 ssh tidak ada hosting "gagal_remote_command 2> & 1; true "2>/dev/null || echo, koneksi SSH gagal 
Koneksi SSH gagal
1
Chris

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 memfilter pesan 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 memfilter teks di antara bingkai dan menjatuhkannya.

1
Saabi

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

Hint: /etc/motd
0
Joseph Kern

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

0
Marie Fischer

Sudahkah Anda mencoba menggunakan konfigurasi subsistem ssh? Anda dapat menemukan contoh di http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm yang bahkan termasuk mencadangkan file.

0
David