Bagaimana saya bisa menjalankan skrip segera setelah terhubung melalui SSH?

24

Saya mulai mengajukan pertanyaan ini tetapi menjawabnya sementara saya membukanya. Saya akan memposting pertanyaan ini, menindaklanjutinya dengan solusi saya dan membiarkannya terbuka untuk solusi potensial lainnya.

<cerita belakang>

Saya pengguna tmux dan vim. Saya suka kerja remote vim karena saya tidak perlu khawatir tentang mesin pengembangan Ubuntu yang hilang ketika film flash memberi saya panik kernel. Menjalankan tmux berarti file yang terbuka menunggu saya setelah saya reboot dan saya dapat melanjutkan dari tempat saya tinggalkan. Saya punya masalah dengan vim yang berjalan di sesi tmux ketika saya terhubung seperti:

ssh example.com -t 'tmux attach'

Masalah UTF-8 muncul yang tidak terpotong saat melakukan shelling secara normal dan hanya menempel pada sesi tmux secara manual.

</ backstory>

Jadi saya ingin metode yang dapat digunakan kembali memulai sesuatu pada ssh login, yang tidak mempengaruhi hal-hal lain yang telah saya konfigurasikan di .zshrc(atau Anda .bashrcjika Anda masih menggunakan bash) yang mungkin diperlukan untuk lingkungan pengembangan saya, yang tidak muncul ketika saya sesekali bekerja secara lokal pada mesin yang sangat dikatakan.

connrs
sumber

Jawaban:

13

Ketika Anda menjalankan ssh example.com, daemon ssh memulai shell login untuk Anda, dan shell login membaca Anda ~/.profile( ~/.bash_profileatau ~/.zprofileatau ~/.logintergantung pada shell login Anda). Ketika Anda menentukan perintah untuk menjalankan dari jarak jauh (dengan atau tanpa -t), daemon ssh memulai sebuah shell biasa, sehingga Anda .profiletidak terbaca. Obat:

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

Kebanyakan daemon ssh dikonfigurasikan untuk menolak variabel lingkungan transmisi kecuali untuk LC_*. Jika daemon ssh aktif example.commemungkinkan, Anda dapat menyalahgunakan LC_*variabel khusus untuk memulai tmux secara otomatis - letakkan ini di ~/.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

kemudian masuk dengan LC_tmux_session= ssh example.comatau LC_tmux_session=session_name ssh example.com.

Jawaban ini memiliki informasi lebih lanjut tentang melewati variabel lingkungan melebihi ssh.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Alasan saya tidak menggunakan ssh example.com -t 'tmux attach'bukan karena masalah memuat lingkungan saya tetapi karena saya punya masalah dengan tampilan karakter UTF-8; masalah ini tidak ada saat menghubungkan dengan cara konvensional. Inilah mengapa pertanyaan ini adalah tentang menjalankan skrip segera setelah terhubung melalui SSH.
connrs
Saya suka solusi Anda. Elegan
connrs
@connrs: Apakah Anda memiliki masalah dengan UTF-8 bahkan ketika Anda menjalankannya .profile? Saya berasumsi bahwa masalahnya adalah karena salah penempatan lokal pada mesin target, yang Anda atasi /etc/profileatau .profileperbaiki. Masalah lokal mungkin dapat diperbaiki dengan informasi lebih lanjut.
Gilles 'SANGAT berhenti menjadi jahat'
Saya ingin kembali ke kantor untuk menguji ini. Anda sepenuhnya benar, sumber / etc / profile tidak memicu perilaku yang tepat. Anda sekarang telah benar-benar menyelesaikan masalah yang memotivasi saya untuk mengajukan pertanyaan yang lebih umum ini
connrs
6

Saya sebelumnya menyarankan pengaturan PermitUserEnvironment yesdan menambahkan variabel lingkungan di Anda ~/.ssh/environmentsampai Eli Heady menyumbang dengan saran yang lebih baik di komentar di bawah.

Buka .zlogin(bash: .bash_profiledll.) Anda dan masukkan yang berikut ini:

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

Inspirasi diambil dari: Bagaimana cara meminta input dalam skrip shell Linux?

Perhatikan bahwa saya telah menggunakan .zloginfile tersebut tetapi Anda dapat menggunakan .zshrcfile Anda tetapi saya ingin menjaga dotfile saya tetap rapi dan memisahkannya sehingga saya dapat menggunakannya pada komputer lain.

Ganti pertanyaan dengan sesuatu yang sesuai untuk diri Anda dan gantikan MY_SSH_CONNECTION="yes" tmux attachdengan apa pun yang ingin Anda jalankan pada saat itu.

Perhatikan bagaimana skrip mengatur MY_SSH_CONNECTION="yes"sebelum tmux attachmeneruskannya ke tmux karena skrip juga akan membuka shell yang akan mengakses skrip yang sama di atas dan akan mencegah rekursi.

connrs
sumber
2
Penggunaan PermitUserEnvironment tidak akan dimungkinkan di beberapa lingkungan karena implikasi keamanan potensial. SSH menetapkan variabel $ SSH_CONNECTION, yang dapat digunakan sebagai pengganti $ SSH_LOGIN di .zlogin Anda, meniadakan kebutuhan untuk menggunakan ~ / .ssh / lingkungan. Sesuatu seperti if [[ "$SSH_CONNECTION" != "" ]]harus melakukannya.
Eli Heady
3

Saya sendiri, saya menambahkan ini ke file .bash_profile saya:

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

Ini memberi saya waktu untuk membatalkan pemasangan kembali atau membuat sesi layar. Ini tidak akan berfungsi pada format 'ssh system command' (yang tidak memanggil profil ~ /.*). Fungsi shell diatur untuk memasang kembali jika saya batal.

Arcege
sumber
Besar! Saya berhasil f * ini dengan meletakkan di bashrc, dan kemudian di setiap jendela layar baru - ketika mengubah ke. Profil itu berfungsi dengan baik.
Hugo
0

Anda mungkin mempertimbangkan untuk berlari

ssh remotehost -t screen -DR

dan jalankan sesi terminal Anda di sana. Anda kemudian dapat melepaskan ( ^A^D) dan memasang kembali nanti (dari klien yang berbeda juga). Ini akan membuat masalah dengan inisialisasi non-interaktif hilang karena layar menjaga sesi terminal interaktif penuh (opsional cangkang masuk juga, man screen(1) atau ^A?)

lihat
sumber
Seperti yang disebutkan dalam pertanyaan saya, saya menggunakan tmux daripada layar GNU untuk mengelola sesi saya. Dan ketika dimuat dengan -t 'tmux attach'saya memiliki masalah dengan vim yang tidak hadir secara normal. Inilah sebabnya mengapa pertanyaan sebenarnya adalah tentang menjalankan skrip pada ssh connect daripada manajemen layar / sesi. Permintaan maaf karena tidak jelas dalam pertanyaan saya
connrs
Maaf, Anda menyebutkan tmux tetapi itu tidak berarti apa-apa bagi saya. Terima kasih telah menyebutkan alat baru!
lihat
0

Untuk berbicara dengan masalah UTF-8 secara khusus, jika Anda menambahkan

SendEnv LANG

Dan $LANGdiatur ke sesuatu seperti en_US.UTF-8di ujung lokal dan sshd Anda di ujung remote memungkinkan SendEnvdirektif (dengan AcceptEnvdi sshd_config), tmux di ujung yang lain harus menghormatinya. Saya memiliki masalah ini untuk sementara waktu dan sulit untuk memecahkan masalah.

Chris W.
sumber
0

Jika Anda ingin menjalankannya setiap kali terhubung, Anda bisa menambahkan tmux attachke bagian bawah komputer Anda ~/.profilepada mesin jarak jauh.

linesarefuzzy
sumber