Ssh, chạy một lệnh khi đăng nhập, và sau đó vẫn đăng nhập?


29

Tôi đã thử điều này với mong đợi, nhưng nó không hoạt động: cuối cùng nó đã đóng kết nối.

Chúng ta có thể chạy một tập lệnh thông qua ssh sẽ đăng nhập vào các máy từ xa, chạy lệnh và không ngắt kết nối không?

Vì vậy, ssh trong một máy, cd vào một thư mục như vậy và như vậy, sau đó chạy một lệnh và tiếp tục đăng nhập.

-Jonathan

(mong đợi tôi đã sử dụng)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
Có phải tôi hoặc bạn đang "tự động hóa" xác thực mật khẩu theo cách này, thay vì sử dụng pubkey hoặc phương pháp lành mạnh khác?
grawity

Câu trả lời:


25

Thêm một ; /bin/bashvào cuối dòng lệnh của bạn ở phía xa? Đó là:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

Thậm chí tốt hơn, thay đổi .bashrc của root thành một cái gì đó như thế này:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
Bạn có thể muốn thêm -ivào bash đó.
Teddy

Yeh, tôi cho rằng :)
Bill Weiss

Khi tôi làm điều đó, việc hoàn thành tab bị phá vỡ trong trình bao mới (ngay cả với "-i") - bạn có biết tại sao / cách khắc phục không?
Bộ giải mã

1
Tôi đã thử nghiệm câu trả lời mới của tôi ở đây, nó hoạt động rất tốt. Một chút thô, nhưng nó hoạt động.
Bill Weiss

7
Cố gắng ssh -tphân bổ một pty.
Tạm dừng cho đến khi có thông báo mới.

4

Nếu bạn ổn với việc thực hiện điều này trong Python, thì pectect có một ví dụ thực hiện gần như chính xác những gì bạn đang yêu cầu:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Để thực hiện việc này với ssh thay vì ftp, bạn muốn có mã tương tự như sau (các tệp ví dụ trong phần mở rộng có nhiều chi tiết và thông tin hơn, nhưng đây là những điều cơ bản):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Đừng hiểu sai ý tôi, tôi YÊU mong đợi (đặc biệt là tự động khai thác), nhưng python thì thật dễ dàng để tôi tự mò mẫm.


Tôi cũng đang chuyển từ kỳ vọng sang khai thác. python bây giờ phổ biến hơn nhiều.
JM Becker

4

Cách dễ nhất và sạch nhất để ssh vào máy chủ, tạo ra một vỏ tương tác và chạy các lệnh bên trong lớp vỏ đó là tạo một tệp RC tùy chỉnh cho bash.

Trong tệp bashrc tùy chỉnh của bạn trên máy chủ, trước tiên hãy nguồn tệp mặc định và sau đó thêm các lệnh tùy chỉnh của bạn, ví dụ:

~ / .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

Sau đó, bạn có thể bắt đầu phiên SSH của mình như thế này:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

Các -tlực lượng lựa chọn một phân bổ pseudo-tty, vì vậy mà những thứ như công việc bằng tab hoàn thành.

Các --rcfilequy định cụ thể tùy chọn mà rcfile để tải thay vì một mặc định. Quan trọng: bạn phải đặt "đối số dấu gạch ngang kép" trên dòng lệnh trước các tùy chọn ký tự đơn để được nhận dạng.

Đối -isố / bin / bash nằm ở đó để gọi trình bao tương tác.


thật ra là không. Phải làm gì nếu tôi muốn chạy các lệnh khác nhau cho mỗi kết nối?
Eugen Konkov

1

Nếu bất cứ ai muốn thông tin về những gì đang xảy ra trong nền, bạn nên xem hướng dẫn sử dụng sshd:

Khi người dùng đăng nhập thành công, sshd thực hiện như sau:

  1. Nếu thông tin đăng nhập ở mức tty và không có lệnh nào được chỉ định, hãy in thời gian đăng nhập lần cuối và / etc / motd (trừ khi bị chặn trong tệp cấu hình hoặc bởi ~ / .hushlogin; xem phần PHIM).
  2. Nếu đăng nhập là một tty, ghi lại thời gian đăng nhập.
  3. Kiểm tra / etc / nologin và / var / run / nologin; nếu có, nó sẽ in nội dung và thoát (trừ khi root).
  4. Thay đổi để chạy với đặc quyền người dùng bình thường.
  5. Thiết lập môi trường cơ bản.
  6. Đọc tệp ~ / .ssh / môi trường, nếu nó tồn tại và người dùng được phép thay đổi môi trường của họ. Xem tùy chọn PermitUserEn Môi trường trong sshd_config (5).
  7. Thay đổi thư mục nhà của người dùng.
  8. Nếu ~ / .ssh / rc tồn tại, hãy chạy nó; khác nếu / etc / ssh / sshrc tồn tại, chạy nó; mặt khác chạy xauth (1). Các tệp `` RC '' được cung cấp giao thức xác thực X11 và cookie trong đầu vào tiêu chuẩn. Xem SSHRC, bên dưới.
  9. Chạy shell hoặc lệnh của người dùng .

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

Nói chung, bạn nên tránh sử dụng ssh theo cách này vì nó đánh bại mục đích của nó.
Làm một

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

để xem khóa của bạn có được liệt kê trong nhóm phiên hoạt động ssh hay không, hãy tự thêm nó (với ssh-add).

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.