Chạy lệnh ssh từ xa với Full Đăng nhập Shell


48

Tôi muốn làm một cái gì đó như ssh example.com 'ls'Tuy nhiên trên mỗi trang ssh:

Nếu lệnh được chỉ định, nó được thực thi trên máy chủ từ xa thay vì vỏ đăng nhập.

Vì vậy, những gì xảy ra là lshiển thị đầu ra của nó và sau đó ssh thoát.

Những gì tôi không thể tìm ra là làm thế nào để mở vỏ đăng nhập đầy đủ và sau đó chạy lệnh trong vỏ đó. Để lại vỏ mở sau khi lệnh được chạy. Như thể tôi đã tự làm như sau:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Có ý kiến ​​gì không?


đây là một câu hỏi tương tự superuser.com/questions/261617/ Mạnh nhưng không có câu trả lời nào thực sự phù hợp với những gì tôi đang cố gắng làm.
matthew

Thế còn ssh example.com 'ls;bash'?
Andrejs Cainikovs

bạn cần -i trên các hệ thống của tôi để biến lớp vỏ thứ hai thành một lớp tương tác.
Flexo

tùy chọn -t là câu trả lời cho câu hỏi của bạn. Các tùy chọn khác (ví dụ: móc khóa) tồn tại nhưng phụ thuộc vào nhu cầu thực sự của bạn, không đủ rõ ràng với tôi.
hornetbzz

@hornetbzz -t cho tôi giả. Nhưng nếu không thì hành vi là như nhau. Tôi muốn khởi chạy một shell tương tác, chạy một lệnh bên trong shell đó và để shell vẫn mở sau khi lệnh được chạy.
matthew

Câu trả lời:


40

Chỉ cần nói bash để thực thi lsvà sau đó chính nó trong một vỏ đăng nhập

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
Thật không may, điều này dường như không hoạt động trong khi sử dụng screen. Nếu không thì điều này có vẻ như nó làm những gì tôi đã cố gắng làm.
matthew

31
ssh user@host -t 'ls; exec $SHELL -l'

-tBuộc phân bổ thiết bị đầu cuối. Điều này có thể được sử dụng để thực hiện các chương trình dựa trên màn hình tùy ý trên một máy từ xa. Là hơi đúng hơn bash -i.

exec Không có quá trình mới được tạo ra.

-ltìm kiếm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, và đọc và thực thi các lệnh từ ... Nếu không có điều này, bạn có thể không thể chạy tập lệnh / lệnh từ thư mục ~ / bin, bởi vì mã này từ ~ / .profile sẽ không được thực thi nếu không có -lcờ:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan Điều này có thể hoạt động như một cách giải quyết, nhưng tôi thực sự thích lệnh chạy bên trong shell và không chỉ mở một shell mới sau khi lệnh được chạy.
matthew

+1, -t chắc chắn là cách đúng đắn để vượt qua -i, tôi chỉ quên nó thôi.
Flexo

@matthew: Bạn sẽ phải tự vá bashđể cho phép điều đó.
grawity

@grawity không thực sự, xem câu trả lời của tôi dưới đây
fons

@matthew, sử dụng exec bashhoặcexec $SHELL
Eugen Konkov

1

Trong nhận xét của bạn về câu trả lời của fons, bạn nói rằng nó không hoạt động trong khi sử dụng screen.

Bạn có thể giải thích về điều đó? Nhìn vào mã nguồn cho openssh, sshd thực thi lệnh bằng cách gọi

YOUR_DEFAULT_SHELL -c COMMAND

Vì vậy, ví dụ, nếu vỏ mặc định của bạn là screen, thì điều này sẽ không làm việc tất cả những gì tốt vì screen's -ccờ chỉ ghi đè nó .scrreenrc. Vì vậy, thực sự không có cách nào để gửi lệnh tới màn hình nếu đó là vỏ mặc định của bạn. Bạn sẽ phải thực sự chạy màn hình như lệnh được đưa cho ssh, nhưng với lớp vỏ mặc định không phải là màn hình .

Nếu đó là những gì bạn đang cố gắng thực hiện, tôi nghĩ mọi thứ sẽ trở nên thực sự kỳ lạ, vì screencũng sẽ đóng cửa sổ với các chương trình không tương tác, vì vậy bạn sẽ phải thực hiện một thủ thuật tương tự với fons, nhưng sâu hơn một cấp. SO, với, ví dụ / bin / bash (và không phải màn hình) làm vỏ mặc định của bạn Một cái gì đó như:

ssh user@host -t 'screen bash -l -c "ls;bash"'

Mà nên - hít một hơi thật sâu - ssh vào máy chủ, chạy bash -c bằng lệnh màn hình, sẽ tạo ra một cửa sổ mới. Nếu cửa sổ này vừa mở ls, nó sẽ kết thúc và màn hình sẽ chấm dứt, vì vậy chúng tôi sử dụng thủ thuật của fons bên trong cửa sổ màn hình mới .

Tôi nghĩ rằng nó sẽ hoạt động, nếu đó là ngay cả những gì bạn đang cố gắng làm;)


Tôi nghĩ rằng vấn đề tôi gặp phải screentrong tình huống này, là tôi thường tải nó exec screen -RRtừ tôi .profile. Điều này có nghĩa là bash -lcố gắng tải màn hình mà ném phần còn lại của màn hình. có vẻ như tôi có thể khắc phục bằng cách xóa '-l' trong cả hai giải pháp của bạn và @fons (sau đó bạn sẽ đưa tôi vào screen). Mặc dù đó là loại rượu mạnh.
matthew

0

Nhiều tùy chọn -t buộc phân bổ tty, ngay cả khi ssh không có tty cục bộ:

ssh -tt user@host 'bash -l -c "/path/to/command'
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.