Làm cách nào để chạy tập lệnh ngay sau khi kết nối qua SSH?


24

Tôi bắt đầu hỏi câu hỏi này nhưng trả lời nó trong khi tôi mở nó ra. Tôi sẽ đăng câu hỏi này, theo dõi nó với giải pháp của tôi và để nó mở cho các giải pháp tiềm năng khác.

<hậu trường>

Tôi là người dùng tmux và vim. Tôi thích công việc vim từ xa vì tôi không phải lo lắng về việc các máy phát triển Ubuntu sẽ ngừng hoạt động khi một bộ phim flash khiến tôi hoảng loạn. Chạy tmux có nghĩa là các tệp đang mở đang đợi tôi sau khi tôi khởi động lại và tôi có thể tiếp tục từ nơi tôi rời đi. Tôi đã gặp sự cố với vim khi chạy trong phiên tmux khi tôi kết nối như vậy:

ssh example.com -t 'tmux attach'

Các vấn đề UTF-8 cắt xén mà không cắt xén khi pháo kích bình thường và chỉ gắn vào một phiên tmux bằng tay.

</ hậu trường>

Vì vậy, tôi muốn một phương pháp có thể sử dụng lại để bắt đầu một cái gì đó khi đăng nhập ssh, nó không ảnh hưởng đến bất kỳ thứ gì khác mà tôi đã cấu hình trong .zshrc(hoặc .bashrcnếu bạn vẫn sử dụng bash) có thể được yêu cầu cho môi trường phát triển của tôi, điều đó không cần thiết xuất hiện khi tôi thỉnh thoảng làm việc cục bộ trên máy nói.

Câu trả lời:


13

Khi bạn chạy ssh example.com, trình nền ssh bắt đầu một vỏ đăng nhập cho bạn và vỏ đăng nhập sẽ đọc ~/.profile( ~/.bash_profilehoặc ~/.zprofilehoặc ~/.logintùy thuộc vào vỏ đăng nhập của bạn). Khi bạn chỉ định một lệnh để chạy từ xa (có hoặc không có -t), trình nền ssh bắt đầu một trình bao thông thường, do đó, bạn .profilekhông đọc được. Biện pháp khắc phục:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

Hầu hết các daemon ssh được cấu hình để từ chối truyền các biến môi trường ngoại trừ LC_*. Nếu trình nền ssh trên example.comcho phép, bạn có thể lạm dụng một LC_*biến tùy chỉnh để tự động khởi động tmux - đặt cái này vào trong ~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

sau đó đăng nhập bằng LC_tmux_session= ssh example.comhoặc LC_tmux_session=session_name ssh example.com.

Câu trả lời này có nhiều thông tin hơn về việc chuyển các biến môi trường qua ssh.


Lý do tôi không sử dụng ssh example.com -t 'tmux attach'không phải vì nó có vấn đề khi tải môi trường của tôi mà vì tôi gặp vấn đề với hiển thị ký tự UTF-8; vấn đề này không tồn tại khi kết nối theo cách thông thường. Đây là lý do tại sao câu hỏi này là về việc chạy các tập lệnh ngay lập tức sau khi kết nối qua SSH.
connrs

Tôi yêu giải pháp của bạn mặc dù. Elegant
connrs

@connrs: Bạn có gặp vấn đề với UTF-8 ngay cả khi bạn chạy .profilekhông? Tôi giả sử sự cố là do cài đặt không chính xác vị trí trên máy đích, mà bạn /etc/profilehoặc đã .profilesửa. Vấn đề bản địa có thể khắc phục được với nhiều thông tin hơn.
Gilles 'SO- đừng trở nên xấu xa'

Tôi muốn quay lại văn phòng để kiểm tra điều này. Bạn hoàn toàn chính xác, tìm nguồn cung cấp / etc / profile sẽ kích hoạt hành vi phù hợp. Bây giờ bạn đã thực sự giải quyết được vấn đề thúc đẩy tôi đặt câu hỏi chung chung hơn này
bao gồm

6

Trước đây tôi đã khuyên cài đặt PermitUserEnvironment yesvà thêm một biến môi trường trong ~/.ssh/environmentcho đến khi Eli Heady sứt mẻ với một gợi ý tốt hơn trong các bình luận bên dưới.

Mở .zlogin(bash: .bash_profilevv) của bạn và đặt như sau:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

Cảm hứng lấy từ: Làm thế nào để tôi nhắc nhập liệu trong tập lệnh shell Linux?

Lưu ý rằng tôi đã sử dụng .zlogintệp nhưng bạn có thể sử dụng .zshrctệp của mình nhưng tôi muốn giữ gọn gàng các dotfiles của mình và nó tách nó ra để tôi có thể sử dụng nó trên các máy khác.

Thay thế câu hỏi bằng một cái gì đó phù hợp với bản thân và thay thế MY_SSH_CONNECTION="yes" tmux attachbằng bất cứ điều gì bạn muốn chạy vào thời điểm đó.

Lưu ý cách tập lệnh MY_SSH_CONNECTION="yes"trước đó tmux attachchuyển qua tmux vì nó cũng sẽ mở một trình bao sẽ truy cập vào tập lệnh tương tự ở trên và sẽ ngăn chặn mọi đệ quy.


2
Việc sử dụng PermitUserEn Môi trường sẽ không thể thực hiện được trong một số môi trường do các tác động bảo mật tiềm ẩn. SSH đặt biến $ SSH_CONNECTION, có thể được sử dụng thay cho $ SSH_LOGIN của bạn trong .zlogin của bạn, không cần phải sử dụng ~ / .ssh / môi trường. Một cái gì đó như if [[ "$SSH_CONNECTION" != "" ]]nên làm điều đó.
Eli Heady

3

Chính tôi, tôi thêm phần này vào các tệp .bash_profile của mình:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Điều này cho tôi một chút thời gian để hủy bỏ việc gắn lại hoặc tạo một phiên màn hình. Nó sẽ không hoạt động trên các định dạng 'ssh system system' (không gọi hồ sơ ~ /.*). Một hàm shell được thiết lập thành reattach nếu tôi hủy bỏ.


Tuyệt quá! Tôi đã quản lý để cải thiện điều này bằng cách đưa vào bashrc, và sau đó trong mỗi cửa sổ màn hình mới - khi thay đổi thành .profile, nó hoạt động tốt.
Hugo

0

Bạn có thể cân nhắc chạy

ssh remotehost -t screen -DR

và chạy phiên cuối của bạn ở đó. Sau đó, bạn có thể tách ( ^A^D) và gắn lại sau (từ một ứng dụng khách khác). Nó sẽ làm cho vấn đề khởi tạo không tương tác biến mất khi màn hình giữ đầy đủ các phiên thiết bị đầu cuối tương tác (cả vỏ đăng nhập tùy chọn, man screen(1) hoặc ^A?)


Như đã đề cập trong câu hỏi của tôi, tôi đang sử dụng tmux thay vì màn hình GNU để quản lý các phiên của mình. Và khi tải với -t 'tmux attach'tôi có vấn đề với vim không có mặt bình thường. Đây là lý do tại sao câu hỏi thực sự là về việc chạy các tập lệnh trên ssh kết nối thay vì quản lý màn hình / phiên. Xin lỗi vì đã không rõ ràng hơn trong câu hỏi của tôi
Connrs 23/03

Xin lỗi, bạn đã đề cập đến tmux nhưng nó không có ý nghĩa gì với tôi. Cảm ơn đã đề cập đến một công cụ mới mặc dù!
sehe

0

Để nói riêng về các vấn đề UTF-8, nếu bạn thêm

SendEnv LANG

$LANGđược đặt thành một cái gì đó giống như en_US.UTF-8ở đầu cục bộ và sshd của bạn ở đầu từ xa cho phép SendEnvchỉ thị (có AcceptEnvin sshd_config), tmux ở đầu bên kia sẽ tôn trọng nó. Tôi đã có vấn đề này trong một thời gian và rất khó để khắc phục sự cố.


0

Nếu bạn muốn nó chạy mỗi khi bạn kết nối, bạn chỉ cần thêm tmux attachvào phần dưới cùng của mình ~/.profiletrên máy từ xa.

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.