Tôi tự trả lời, vì cuối cùng tôi đã khám phá ra bí mật. Không có -t
tùy chọn nào ssh
, cũng không phải -l
tùy chọn cho việc bash
tự mình đăng nhập shell - nhưng kết hợp chúng lại hoạt động.
ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'
thay đổi biến thư mục, bộ môi trường, và sau đó bắt đầu vỏ đăng nhập đúng (sự khác biệt duy nhất mà tôi đã tìm thấy cho đến nay là /etc/motd
không được hiển thị theo cách này - đó là bình thường ssh
's hoặc login
' s trách nhiệm, chứ không phải bash
's - khác hơn tất cả mọi thứ mà dường như để hoạt động hoàn hảo, và tất cả các biến môi trường là giống hệt nhau).
Những thay đổi môi trường / thư mục này xảy ra sau ssh, vì vậy chúng không bị hạn chế bởi PermitUserEnvironment
và các cài đặt liên quan (chính xác như kế hoạch), nhưng trước .bashrc
/ .profile
được thực thi. Điều này có những mặt trái và nhược điểm - khó hơn là ghi đè lên thứ gì đó được đặt từ các tập lệnh bash init như PS1
, nhưng dễ dàng hơn để đóng gói chính xác các giá trị đúng vào ssh
các dòng lệnh và phải .profile
thực hiện tất cả các công việc nặng.
Và nếu thực sự cần thiết, thực sự khá dễ dàng để bash thực thi một cái gì đó sau .profile
dòng lệnh như ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'
- rất xấu khi đặt theo cách đó, nhưng những .profile
tệp thay thế này có thể được chuẩn bị trước. (theo như tôi có thể nói bash
có một vài vị trí ứng cử viên cho .profile
kịch bản và sẽ thực thi vị trí đầu tiên được tìm thấy - . file
không có dự phòng tự động như vậy, vì vậy bạn sẽ cần kiểm tra xem bình thường của bạn ở đâu profile
nếu bạn muốn làm điều đó)