Làm thế nào để ssh chạy một lệnh?


15

Tôi đang sử dụng Bash trên cả máy khách và máy chủ. Khi chạy lệnh qua SSH:

  • ssh <host> 'declare' đưa ra một danh sách các biến shell.

  • ssh <host> 'mount' đưa ra một danh sách các điểm gắn kết.

Tuy nhiên, declarelà một nội dung Bash, trong khi mountlà một lệnh bên ngoài. Làm thế nào để SSH biết nên chạy cái nào nếu có shell dựng sẵn và một lệnh bên ngoài có cùng tên trên máy chủ?


2
ssh luôn chạy shell của bạn, được lưu trữ trong /etc/passwd. Nếu đó là /usr/sbin/nologinbạn không thể đăng nhập.
Ipor Sircer

Câu trả lời:


21

Các sshlệnh chạy mà bạn cung cấp trong trình bao của người dùng từ xa (thu được từ /etc/passwd), như hiển thị từ mã nguồn :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

Do đó, các lệnh tương ứng được thực thi cho ví dụ của bạn trên máy chủ từ xa là:

  • bash -c declare
  • bash -c mount

Cả hai đều được chuyển đến bashvà đánh giá. Các phần dựng sẵn được đánh giá bên trong và các lệnh bên ngoài được gọi như thể bạn sẽ làm điều đó từ dấu nhắc dòng lệnh cục bộ của mình.


Nếu một shell luôn được khởi động bởi ssh daemon, thì điều thú vị là, khi người dùng gọi ssh bằng lệnh, thì shell đó không phải là shell đăng nhập, ngay cả khi người dùng thực hiện một số loại đăng nhập. Bất kỳ ý tưởng?
Cyker

Đúng. Shell chạy lệnh là 1) Không có shell đăng nhập 2) Không tương tác. Bạn có thể buộc tương tác bằng công -ttắc, nhưng nó vẫn sẽ không tải các tệp RC.
Jakuje

1
Lưu ý rằng sshd(máy chủ) đang làm điều này, không phải ssh(máy khách).
ysdx

@ysdx Họ đang làm việc cùng nhau. Máy khách báo cho máy chủ thực thi lệnh thông qua shell và máy chủ thực hiện nó.
Barmar
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.