2013-08-29 42 views
95

Tôi đang cố tìm lệnh UNIX hoặc bash để chạy lệnh sau khi kết nối với máy chủ ssh. Ví dụ:Chạy ssh và thực thi lệnh ngay lập tức

ssh [email protected] "tmux list-sessions" 

Mã trên hoạt động, nó liệt kê các phiên, nhưng sau đó ngắt kết nối ngay lập tức. Đặt nó trong sshrc ở phía máy chủ hoạt động, nhưng tôi cần có khả năng gõ nó ở phía máy khách. Tôi muốn có thể chạy một lệnh, nó đăng nhập, mở cửa sổ, sau đó chạy lệnh tôi đã thiết lập. Ive đã cố gắng

[command] | ssh [email protected] 

ssh [email protected] [command] 

ssh [email protected] "[command]" 

ssh -t [email protected] [command] 
+2

Bạn muốn chạy một lệnh, và sau đó được để lại trong một trình bao tương tác trên máy chủ từ xa? – Barmar

Trả lời

152
ssh -t 'command; bash -l' 

sẽ thực thi lệnh và sau đó khởi động vỏ đăng nhập khi hoàn thành.

+1

Quên cú pháp của riêng tôi, gần như đã từ bỏ điều này! Đối với bất cứ ai khác, chỉ cần hậu tố bất kỳ lệnh nào với "; bash -l". Có lẽ bạn có thể thay đổi nó thành '[lệnh]; bash -l 'hoặc một cái gì đó cho rõ ràng vì lợi ích? Tôi sẽ thay đổi câu hỏi của tôi. Cảm ơn! – cadlac

+4

Tôi nghĩ rằng nó thậm chí còn tốt hơn để 'exec bash -l'. –

+0

Thật tuyệt vời, nhưng nếu bạn muốn lệnh hiển thị trong lịch sử bash thì sao? – bsmoo

13

Bạn có thể sử dụng tùy chọn LocalCommand dòng lệnh nếu tùy chọn PermitLocalCommand được kích hoạt:

ssh username @ hostname -o LocalCommand = "tmux list-phiên"

Để biết thêm chi tiết về các tùy chọn có sẵn, hãy xem trang hướng dẫn sử dụng ssh_config.

+1

Điều này cũng làm việc, tôi đã thử nó, và sẽ cho phép khả năng mở rộng lớn hơn! Cảm ơn! – cadlac

+1

Đối với tôi, (OS X) điều này phải là 'ssh -o" LocalCommand tmux danh sách phiên "user @ hostname'. –

+8

Câu trả lời này dựa trên sự hiểu lầm câu hỏi. Câu hỏi đặt ra là chạy một lệnh trên máy chủ từ xa ngay sau khi kết nối. LocalCommand (như tên của nó) chạy một lệnh trên máy cục bộ. – robo

5

Đây không phải là khá những gì bạn đang tìm kiếm, nhưng tôi thấy nó hữu ích trong các trường hợp tương tự.

Gần đây tôi đã thêm vào phần sau đây để $HOME/.bashrc của tôi (một cái gì đó tương tự nên có thể với vỏ ngoài bash):

if [ -f $HOME/.add-screen-to-history ] ; then 
    history -s 'screen -dr' 
fi 

tôi giữ một phiên screen chạy trên một máy đặc biệt, và tôi đã có vấn đề với ssh kết nối với máy đang bị xóa, yêu cầu tôi chạy lại screen -dr mỗi khi tôi kết nối lại.

Với bổ sung đó, và sau khi tạo tệp (trống) trong thư mục chính của tôi, tôi tự động có lệnh screen -dr trong lịch sử của tôi khi trình bao bắt đầu. Sau khi kết nối lại, tôi chỉ có thể nhập Control-PNhập và tôi quay lại phiên màn hình của mình - hoặc tôi có thể bỏ qua nó. Thật linh hoạt, nhưng không phải là hoàn toàn tự động và trong trường hợp của bạn, việc nhập số này dễ dàng hơn gõ tmux list-sessions.

Bạn có thể muốn thực hiện lệnh history -s vô điều kiện.

Điều này yêu cầu cập nhật $HOME/.bashrc của bạn trên mỗi hệ thống đích, có thể hoặc không làm cho nó không phù hợp với mục đích của bạn.

+0

Điều này khá hữu ích, nhưng những gì tôi nhận thấy là lịch sử sẽ bị xóa, ngoại trừ lệnh mới khi đăng nhập mới. Bạn có biết tại sao điều đó xảy ra và cách bạn có thể ngăn chặn điều đó không? Tôi chỉ nhận thấy rằng sau khi tôi nhận xét ra dòng. Bashrc lịch sử đầy đủ bây giờ đã có. – Andy

Các vấn đề liên quan