Nếu shell đăng nhập của bạn không thể được thực thi trên một số máy, thì bạn không thể đăng nhập vào nó qua SSH hoặc bằng hầu hết các phương thức khác cho vấn đề đó. Máy chủ SSH luôn thực thi shell đăng nhập của bạn. Nếu bạn truyền một lệnh trên ssh
dòng lệnh thì shell đăng nhập được thực thi -c
và chuỗi lệnh¹ làm đối số; mặt khác, vỏ đăng nhập được thực thi như một vỏ đăng nhập không có đối số.
Nếu có một cách để bỏ qua shell đăng nhập, đó sẽ là một lỗ hổng bảo mật. Một tài khoản có thể được cấu hình như một tài khoản bị hạn chế bằng cách tạo vỏ đăng nhập của nó thành một chương trình chỉ thực hiện một nhiệm vụ cụ thể; ví dụ, shell đăng nhập có thể git-shell
chỉ cho phép truy cập vào kho git, hoặc rssh
, v.v.
Để đăng nhập vào máy đó, bạn cần phải sắp xếp /bin/zsh
để có mặt hoặc thay đổi vỏ đăng nhập của bạn thành thứ gì đó hiện diện.
Những gì tôi khuyên trong một môi trường không đồng nhất như thế này là hãy bám vào /bin/sh
như vỏ đăng nhập của bạn, bởi vì nó có mặt ở khắp mọi nơi. Đặt SHELL
biến môi trường thành /bin/zsh
nếu có, theo cách đó, bạn sẽ nhận được zsh dưới dạng vỏ tương tác.
if [ -x /bin/zsh ]; then
export SHELL=/bin/zsh
fi
Trong khi bạn đang ở đó, điều này cho phép bạn tránh mã hóa cứng đường dẫn đến zsh
.
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
Để có được zsh để chạy tự động cho đăng nhập chế độ văn bản, hãy gọi nó từ của bạn .profile
. Nếu bạn muốn sử dụng .zprofile
để thiết lập mọi thứ, hãy biến nó thành một vỏ đăng nhập (nhưng sau đó bạn sẽ không nhận được môi trường tương tự trên các máy không có zsh, vì vậy tôi không khuyến nghị điều này). Chỉ làm điều này nếu đây là thông tin đăng nhập tương tác, không phải khi .profile
tập lệnh của bạn được thực thi bởi tập lệnh, trong khi đăng nhập chế độ GUI, v.v.
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
¹ Client SSH concatenates lập luận không có quyền lựa chọn với các không gian ở giữa, và gửi chuỗi kết quả thông qua kết nối. Các giao thức SSH định nghĩa lệnh là một chuỗi, không phải là danh sách các chuỗi.
/bin/sh
, và sau đó điều khiển từ xa của bạn thực~/.profile
hiện vỏ thích hợp nếu có?