Tôi có thể thực thi một số lệnh khi bắt đầu phiên ssh trước khi chuyển sang chế độ tương tác không?


13

Khi bắt đầu phiên ssh bằng lệnh ssh tôi dường như có hai tùy chọn - phiên tương tác mặc định với env mặc định và bắt đầu từ thư mục chính - hoặc để thực thi lệnh tùy ý nhưng không tương tác (thậm chí các thủ thuật như ssh "command; command; bash -i -l"có vẻ không tốt lắm). Tôi thường xuyên muốn phiên tương tác, nhưng với điều gì đó xảy ra trước đó - thông thường là thay đổi thư mục hoặc đôi khi điều chỉnh môi trường hệ thống. Những thứ này sẽ thay đổi từ phiên này sang phiên khác, vì vậy tôi không thể chỉ dán chúng vào .bashrchoặc như vậy.

Có cách nào để thực hiện điều đó?

Câu trả lời:


13

Tôi tự trả lời, vì cuối cùng tôi đã khám phá ra bí mật. Không có -ttùy chọn nào ssh, cũng không phải -ltùy chọn cho việc bashtự 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/motdkhô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 PermitUserEnvironmentvà 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 sshcác dòng lệnh và phải .profilethự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 .profiledò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 .profiletệp thay thế này có thể được chuẩn bị trước. (theo như tôi có thể nói bashcó một vài vị trí ứng cử viên cho .profilekịch bản và sẽ thực thi vị trí đầu tiên được tìm thấy - . filekhô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 profilenếu bạn muốn làm điều đó)


Tuyệt vời, cảm ơn vì điều này! Tôi đang tìm cách để vào tài khoản của người dùng ngay sau khi đăng nhập và tùy chọn "-t" đã khiến nó hoạt động. Không có tùy chọn đó, shell của bạn không có dấu nhắc, không có lịch sử lệnh, chết vì SIGINT, v.v.
Ashoat

Câu trả lời này thực sự hữu ích nhưng bạn đang thiếu một vài ;giây từ chuỗi đăng nhập ssh đầu tiên. Nó sẽ không cho phép tôi chỉnh sửa câu trả lời của bạn vì tôi không thay đổi đủ. Tôi đã làm điều này để làm việc ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Tôi nghĩ đó là những gì bạn dự định.
Rob Kwasowski

2

Chỉnh sửa .bashrc và đính kèm các cài đặt môi trường dành riêng cho SSH của bạn trong:

if [ $SSH_TTY ]; then
    ...
fi

Điều này sẽ cho phép bạn thêm các cài đặt cụ thể cho các phiên SSH. 'Tất nhiên, nếu tất cả những gì bạn muốn là đặt các biến môi trường tùy ý ngay từ đầu thay đổi theo phiên, tôi không biết làm thế nào bạn có thể khiến máy đoán chúng cho bạn ngoài việc gõ chúng ... bất kể là gì, bạn' sẽ cần một số điều kiện có thể kiểm tra để lựa chọn cài đặt.


2

Từ sshtrang người đàn ông:

Ngoài ra, ssh đọc ~ / .ssh / môi trường và thêm các dòng có định dạng VARNAME = value giá trị vào môi trường nếu tệp tồn tại và người dùng được phép thay đổi môi trường của họ. Để biết thêm thông tin, hãy xem tùy chọn PermitUserEn Môi trường trong sshd_config (5).

mà nói:

PermitUserEn Môi trường
Chỉ định xem ~ / .ssh / môi trường và môi trường = tùy chọn trong ~ / .ssh / ủy quyền_key được xử lý bởi sshd (8). Mặc định là không có. Cho phép xử lý môi trường có thể cho phép người dùng bỏ qua các hạn chế truy cập trong một số cấu hình bằng các cơ chế như LD_PRELOAD.

Cơ sở này có thể được sử dụng để thực hiện có điều kiện các câu lệnh trong điều khiển từ xa của bạn ~/.bashrcbằng cách sử dụng ifcấu trúc mà Mickey đề xuất.


1

Đơn giản chỉ cần chạy theo cách này: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : vì vậy mà nhắc nhở sẽ xuất hiện
  • ; bash: để nó quay trở lại điều khiển mặc dù đã thực thi lệnh (tại đây cd) và thoát khỏi phiên ssh

Chào mừng bạn đến với ServerFault! Vui lòng cung cấp và giải thích và / hoặc tài liệu cho các lệnh hoặc tập lệnh để giải thích chúng dùng để làm gì.
Cory Knutson

1
Cảm ơn @CoryKnutson, tôi đã thực hiện các thay đổi theo yêu cầu của bạn
Sumit Ramteke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.