Buộc SSH sử dụng trình bao cụ thể


29

Có cách nào để buộc SSH sử dụng một shell cụ thể ở đầu xa, bất kể shell mặc định của người dùng là gì không?

Tôi đã thử các giải pháp giống như:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

nhưng không may, lớp vỏ mặc định ở đầu từ xa chịu trách nhiệm phân tích phần "lệnh đa dòng phức tạp" và tôi gặp khó khăn trong việc thoát nó đủ để hoạt động cho cả người dùng shell Bash và C.


Câu trả lời:


8

Tôi không tin điều này là có thể, ít nhất là với các hệ thống dựa trên openssh. Nếu bạn có khả năng, một giải pháp tốt hơn có thể là tìm kiếm một tập tin shell-script, và sau đó thực hiện nó với phương thức bạn đã đăng. Nó sẽ có lợi thế là giảm thiểu số lượng thoát cần thiết, nhưng sẽ để lại một tệp phía sau sẽ phải xóa (có lẽ là bước cuối cùng của tập lệnh).


1
Đây là những gì tôi cuối cùng đã làm, nhưng sử dụng scp. Một ý tưởng tuyệt vời.
plinehan

16

Sử dụng một di truyền:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

bạn có nên sử dụng "-s" cho bash để đọc các lệnh từ stdin không?
Weboide

Nó không phải luôn luôn được yêu cầu.
Ignacio Vazquez-Abrams

Tôi sẽ bỏ phiếu này nếu tôi có thể bởi vì nó ngăn các lệnh truy cập vào stdin và câu hỏi là về việc gọi một shell cụ thể.
Eric Woodruff

3
@EricWoodruff, ... gọi một shell cụ thể (trong trường hợp này là bash) chính xác là những gì nó chỉ ra cách làm.
Charles Duffy

1
FYI bạn cũng có thể làm cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. Vì vậy, thay vì một bước bạn có hai bước: bước 1 sao chép tập lệnh của bạn vào một tập tin, bước 2 cattập lệnh vào ssh.
Trevor Boyd Smith

10

Sử dụng thông tin đăng nhập dựa trên khóa, không dựa trên mật khẩu. Sau đó, bạn có thể thêm (danh sách) "lệnh bắt buộc" vào khóa ssh công khai của mình (trong trường "tùy chọn" trong trường hợp SSH1) được cài đặt trên máy chủ (trong tệp ~ / .ssh / ủy quyền cho SSH1 , ~ / .ssh2 / ủy quyền cho SSH2).

Tạo lệnh bắt buộc của bạn để shell mong muốn của bạn được gọi là ...

Thêm: Bạn có thể liên kết tối đa một lệnh bắt buộc với một khóa đã cho. Nếu bạn yêu cầu nhiều lệnh bắt buộc cho các mục đích khác nhau, bạn phải thiết lập các khóa khác nhau. (Tất nhiên bạn có thể đặt nhiều thứ vào một tập lệnh mà bạn gọi thông qua lệnh bắt buộc. Nhưng lưu ý rằng các lệnh bắt buộc luôn được chạy cho một tài khoản / khóa nhất định nếu người dùng đăng nhập, bất kể anh ta có yêu cầu chạy thứ gì đó khác không. Nếu bạn vẫn muốn tôn trọng lệnh ban đầu được yêu cầu, hãy xem cách khai thác $SSH_ORIGINAL_COMMANDbiến ...)

Đọc về "các lệnh bắt buộc" thông qua Google .


Đồ tốt. Đồ họa đó trên trang O'Reilly rất đẹp. Tuy nhiên, trong trường hợp cụ thể của tôi, tôi muốn có thể ép buộc điều này cho bất kỳ người dùng nào, không chỉ người dùng đã thiết lập khóa chính xác. Tôi cũng không có root trên các máy chủ, vì vậy tôi không thể chỉnh sửa các tập tin như thế nào /etc/sshrc.
plinehan

Chà, luôn luôn là máy chủ (hoặc tốt hơn: người thực hiện quyền kiểm soát máy chủ), người gọi các bức ảnh khi bạn kết nối với dịch vụ của nó .... 'chủ sở hữu' của máy chủ quyết định những gì có thể được thực hiện với nó. - Bạn không thể ép buộc bất cứ điều gì 'cho bất kỳ người dùng nào' nếu bạn không có đặc quyền cao hơn họ.
Kurt Pfeifle

Nếu máy khách có thể chạy các lệnh tùy ý thì máy khách cũng có thể chạy một vỏ tùy ý như một lệnh.
Eric Woodruff

@KurtPfeifle liên kết đến O'Reilly bị hỏng
Brian Vandenberg

@BrianVandenberg: Thx cho gợi ý. Tôi đã gỡ bỏ liên kết đó ngay bây giờ.
Kurt Pfeifle

2

Bạn có thể sử dụng -ttùy chọn để buộc phân bổ giả cho chương trình bạn muốn bắt đầu, như thể bạn đang thực hiện shell tiêu chuẩn. Sau đó vượt qua lớp vỏ bạn muốn như một đối số cũ đơn giản.

Với kỹ thuật này, bạn không chỉ có thể sử dụng bất kỳ shell nào được cài đặt mà bạn còn có thể mở vim và các chương trình khác yêu cầu TTY, từ một lệnh duy nhất. Thật tuyệt nếu bạn đang viết một tập lệnh shell đăng nhập bạn vào một nơi nào đó và mở một tập tin trên vim, hoặc htop hoặc một cái gì đó.

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

Không chắc đây có phải là vỏ đăng nhập hay không nhưng có các tùy chọn để làm bash hoạt động giống như vỏ đăng nhập, vì vậy vỏ của bạn cũng có thể có.


1

Đáng ngạc nhiên tôi thấy kết quả khác nhau với những điều sau đây:

chạy trong dấu gạch ngang:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Hiển thị lệnh được trích dẫn đầy đủ đang làm việc như mong đợi.


1
Không có gì đáng ngạc nhiên cả. Trình nền ssh từ xa chạy hiệu quả sh -c "$*". Do đó, bạn đang chạy sh -c "/bin/bash -c echo <(cat)"; chính echolệnh là đối số duy nhất được truyền cho -c<(cat)là đối số riêng biệt hoàn toàn.
Charles Duffy

0

Tôi đã phải đối mặt với một tình huống tương tự khi tôi cần sử dụng đồng xử lý ksh cho sqlplus và tôi chỉ có một ssh thông qua đó phải đọc và viết.

Một cách để làm điều này là chuyển tất cả lệnh phụ thuộc của bạn thành một dòng (sử dụng;) đến / usr / bin / ksh trên máy từ xa. ví dụ:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
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.