Cara menggunakan shell login non-standar untuk login ssh


9

Saat ini saya bekerja di jaringan yang menggunakan LDAP untuk otentikasi. Setelah ditetapkan zshsebagai shell login saya, saya mengalami masalah mendapatkan akses jarak jauh melalui sshsalah satu mesin di jaringan yang, tampaknya, tidak zshdiinstal. Login gagal dengan

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

Jadi pada dasarnya pertanyaannya adalah: Bagaimana saya bisa memberi tahu mesin jarak jauh untuk menggunakan shell login yang berbeda dari yang dikonfigurasi dalam LDAP?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e


Sudahkah Anda mempertimbangkan untuk mengubah shell LDAP Anda menjadi sesuatu yang lebih universal seperti /bin/shdan kemudian memiliki remote ~/.profileexec Anda shell yang sesuai jika tersedia?
RobertL

Itu akan menjadi pilihan, tapi bukan yang sangat bersih, jadi saya lebih suka menghindarinya jika memungkinkan.
Sascha

Jawaban:


10

Jika shell login Anda tidak dapat dijalankan pada beberapa mesin, maka Anda tidak dapat login ke dalamnya melalui SSH, atau dengan sebagian besar metode lain dalam hal ini. Server SSH selalu mengeksekusi shell login Anda. Jika Anda melewati perintah pada sshbaris perintah maka shell login dieksekusi dengan -cdan string perintah arg sebagai argumen; jika tidak, shell login dijalankan sebagai shell login tanpa argumen.

Jika ada cara untuk memotong shell login, itu akan menjadi lubang keamanan. Akun dapat dikonfigurasikan sebagai akun terbatas dengan menjadikan shell login-nya sebuah program yang hanya melakukan satu tugas tertentu; misalnya, shell login bisa jadi git-shellhanya mengizinkan akses ke repositori git, atau rssh, dll.

Untuk masuk ke mesin itu, Anda harus mengatur untuk /bin/zshhadir, atau mengubah shell login Anda ke sesuatu yang ada.

Apa yang saya rekomendasikan di lingkungan yang heterogen seperti ini adalah tetap /bin/shmenggunakan shell login Anda, karena itu ada di mana-mana. Setel SHELLvariabel lingkungan ke /bin/zshjika ada, dengan begitu Anda akan mendapatkan zsh sebagai shell interaktif.

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

Saat Anda melakukannya, ini memungkinkan Anda menghindari pengkodean path ke zsh.

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

Agar zsh dijalankan secara otomatis untuk login mode teks, aktifkan dari Anda .profile. Jika Anda ingin menggunakan .zprofileuntuk mengatur berbagai hal, buatlah sebuah shell login (tapi kemudian Anda tidak akan mendapatkan lingkungan yang sama pada mesin di mana zsh tidak ada, jadi saya tidak merekomendasikan ini). Lakukan ini hanya jika ini adalah login interaktif, bukan ketika Anda .profiledieksekusi oleh skrip, selama mode login GUI, dll.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ Klien SSH menggabungkan argumen non-opsi dengan spasi di antaranya, dan mengirimkan string yang dihasilkan melalui koneksi. Protokol SSH mendefinisikan perintah sebagai string, bukan daftar string.


Terima kasih untuk penjelasan rinci. Sepertinya itu satu-satunya cara untuk pergi yang tidak melibatkan pemasangan zsh pada mesin jarak jauh, dan itu berfungsi dengan baik, jadi saya akan menaatinya.
Sascha

Saya juga menyarankan untuk menambahkan tes [ "0$SHLVL" -lt 2 ]jika shell login default mendukung $SHLVLsehingga bash -lshell lain dapat dijalankan jika perlu (misalnya dalam kasus zsh gagal karena beberapa alasan). Dengan demikian ssh -t host bash -lakan menjalankan bashshell login tanpa mengeksekusi zsh di belakang. Juga, saya akan mengganti exec zshdengan exec zsh -lsehingga .zloginfile bersumber.
vinc17

2

Anda harus menginstal shell pada mesin yang ditentukan jika Anda memiliki akses dengan cara yang berbeda atau memintanya dari administrator untuk melakukan ini untuk Anda atau mengubah shell Anda di ldap menjadi shell yang ada di mesin jarak jauh.

(open) sshd akan selalu memeriksa shell pengguna dan akan selalu mengeksekusi shell itu apa pun yang dilewati untuk dieksekusi. Jika shell lain dilewatkan untuk mengeksekusinya, ia akan mengeksekusinya meneruskannya sebagai argumen ke shell pengguna, misalnya shell pengguna adalah '/ bin / sh' dan Anda meneruskan argumen sebagai shell csh daripada menjalankan "/ bin / sh -c / bin / csh '.


Baca komentar redfast. openssh memang memungkinkan Anda untuk melewati shell default.
Rui F Ribeiro

@Rui F Ribeiro Jika itu semacam menghilangkan logika di balik pengaturan shell untuk sesuatu seperti '/ bin / false' atau '/ sbin / nologin'. Jika Anda merujuk untuk mengganti shell setelah login daripada yang ok, tetapi tidak seperti yang saya tulis di atas (sh -c othersh), jika tidak ada '/ bin / sh' daripada Anda kurang beruntung. (Diuji pada Redhat).
nkms

Benar memang, jika passwd memiliki shell yang tidak terdaftar di / etc / shells, Anda tidak akan login. Tetapi jika Anda bisa login, dan kecuali sshd_config tidak memaksa Anda untuk shell tertentu, perintah apa pun yang dapat dijalankan oleh pengguna adalah permainan yang adil. Jika Anda melakukan beberapa tes lagi, misalnya ssh -l user server "ps ax" | grep bashmudah untuk melihat shell default tidak selalu dipanggil. Apa yang sebenarnya mencegah solusi lain dari bekerja adalah pemeriksaan keamanan zsh tidak berada di / etc / shells
Rui F Ribeiro

@Rui F Ribeiro Jalankan strace -f sshd di sisi server. Anda akan melihat sesuatu seperti "execve (" / bin / bash ", [" bash "," -c "," ps "] ..." Juga, / sbin / nologin adalah shell yang valid di / etc / shells.
nkms

Jawaban @RuiFRibeiro redfast00 jelas salah. nkms benar.
Gilles 'SANGAT berhenti menjadi jahat'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.