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.
/bin/shdan kemudian memiliki remote~/.profileexec Anda shell yang sesuai jika tersedia?