Saya memiliki sepuluh atau lebih server yang saya sambungkan dengan SSH secara teratur. Masing-masing memiliki entri di ~/.ssh/config
file komputer lokal saya .
Untuk menghindari kehilangan kendali atas proses saya yang sedang berjalan ketika koneksi Internet saya terputus secara tidak terelakkan, saya selalu bekerja di dalam sebuah tmux
sesi. Saya ingin cara agar tmux terhubung secara otomatis setiap kali koneksi SSH dimulai, jadi saya tidak harus selalu mengetik tmux attach || tmux new
setelah saya masuk ke SSH.
Sayangnya ini tidak sesederhana yang saya harapkan semula.
- Saya tidak ingin menambahkan perintah apa pun ke
~/.bashrc
server karena saya hanya menginginkannya untuk sesi SSH, bukan sesi lokal. - Menambahkan
tmux attach || tmux new
ke~/.ssh/rc
pada server hanya menghasilkan kesalahan yangnot a terminal
terjadi setelah koneksi, bahkan ketikaRequestTTY force
opsi ditambahkan ke baris untuk server itu di file konfigurasi SSH lokal saya.
~/.ssh/config
: sebagian besar dari Anda yang datang ke sini mungkin tidak mencari salah satu dari lima jawaban pertama, tetapi untuk yang keenam ( stackoverflow.com/a/52838493/5354137 ). Dengantmux
versi yang cukup baru, itu juga cara yang paling masuk akal dalam melakukan sesuatu.Jawaban:
Konfigurasi sisi server:
Untuk memulai tmux secara otomatis di server jarak jauh Anda saat biasanya masuk melalui SSH (dan hanya SSH), edit
~/.bashrc
pengguna atau root Anda (atau keduanya) di server jarak jauh sesuai:Perintah ini membuat sesi tmux dipanggil
ssh_tmux
jika tidak ada, atau melampirkan kembali ke sesi yang sudah ada dengan nama itu. Jika koneksi Anda terputus atau ketika Anda lupa sesi beberapa minggu yang lalu, setiap login SSH secara otomatis membawa Anda kembali ke sesi tmux-ssh yang Anda tinggalkan.Terhubung dari klien Anda:
Tidak ada yang istimewa, hanya
ssh user@hostname
.sumber
ssh_tmux
menjadi$USER
)$SSH_TTY
vs$SSH_CONNECTION
juga.tmux new-session -A -s ssh_tmux
untuk menggantitmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
jauh lebih pendek, jika sedikit lebih membingungkan,-A
memberitahu tmux untuk melampirkan sesi jika sudah adaif [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];
$PS1
, gunakan[[ $- == *i* ]]
sebagai gantinya, karena PS1 dapat didefinisikan meskipun itu bukan shell interaktif.Baiklah, saya menemukan solusi yang sebagian besar memuaskan. Di lokal saya
~/.bashrc
, saya menulis sebuah fungsi:yang pada dasarnya menimpa fungsi terminal ssh untuk memanggil program ssh built-in dengan argumen yang diberikan, diikuti oleh
"tmux attach || tmux new"
.(
$@
Menunjukkan semua argumen yang disediakan pada baris perintah, jadissh -p 123 user@hostname
akan diperluas kessh -t -p 123 user@hostname "tmux attach || tmux new"
)(
-t
Argumennya setara denganRequestTTY Force
dan diperlukan untuk perintah tmux.)sumber
tmux
mendukungnya, pertimbangkan untuk menggunakantmux new -A foo
yang akan melampirkan ke sesi yang ada bernamafoo
jika memungkinkan, membuatnya jika perlu. Ini memungkinkan Anda menyederhanakan fungsi Anda menjadi/usr/bin/ssh -t "$@" tmux new -A
(dan pastikan untuk mengutip$@
!).function ssht
atau sejenisnya sehingga Anda dapat terus menggunakan secarassh
normal. Jika tidak, cukup ketik/usr/bin/ssh
di command prompt setiap kali menghubungkan ke mesin tanpa tmux :)ssht
ke~/bin
.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
Menghubung:
Selama sesi:
Gunakan
Ctrl+d
untuk menyelesaikan sesi (jendela tmux menutup) atauCtrl+b d
untuk melepaskan sementara dari sesi dan menyambungkannya lagi nanti.Ketika Anda berada di dalam tmux kapan saja Anda dapat menggunakan
Ctrl+b s
untuk melihat daftar sesi dan beralih saat ini ke yang lain.Perbaiki .bashrc Anda:
Saya menyarankan Anda untuk menentukan fungsi universal di
.bashrc
:Ini menggunakan
22
port secara default. Tentukan juga alias koneksi cepat Anda:Login tanpa kata sandi:
Dan jika Anda tidak ingin setiap kali mengetik kata sandi daripada menghasilkan
.ssh
kunci untuk masuk secara otomatis :Letakkan kunci publik Anda ke host jarak jauh:
Tips tambahan:
Jika Anda ingin menggunakan session-id sementara yang sesuai dengan sesi bash lokal gunakan sebagai tmux id:
sumber
||
dalam beberapa penggunaan-kasus adalah untuk menyertakannew-session
dalam.tmux.conf
dan hanya selalu menggunakantmux a -t 0
.tmux new-session -A
yang akan melampirkan jika ada, jika tidak maka akan membuat yang baru.Saya menggunakan baris dari @kingmeffisto (Saya tidak diizinkan mengomentari jawaban itu) dan saya menambahkan jalan keluar sehingga menghentikan tmux juga mengakhiri koneksi ssh. Namun ini merusak sesi SFTP jadi saya harus memeriksanya,
$SSH_TTY
bukan$SSH_CONNECTION
.EDIT 4/2018: Tes tambahan untuk terminal interaktif melalui
[[ $- =~ i ]]
untuk memungkinkan alat seperti Ansible untuk bekerja.sumber
Seperti yang dijelaskan dalam posting blog ini, Anda dapat ssh dan kemudian melampirkan ke sesi tmux yang ada dengan satu perintah:
sumber
tmux attach || tmux new
sehingga sesi tmux baru tidak dibuat untuk setiap koneksi). Bagian yang sulit adalah bahwa perintah yang benar adalahssh -t user@host tmux attach || tmux new
dan satu-satunya cara untuk membuat alias sesuatu yang membutuhkan argumen di dalam string perintah adalah membuat fungsi baru, seperti yang saya lakukan di atas.ssh [hostname] -t tmux attach -t [sessionName]
tmux 3.1 atau yang lebih baru¹ pada mesin jarak jauh
Ke dalam lokal Anda
~/.ssh/config
, letakkan²:Tidak terkait, tetapi jika Anda berurusan dengan karakter non-ASCII, saya sarankan untuk mengubahnya menjadi
tmux -u …
untuk mengaktifkan dukungan Unicode secara eksplisit bahkan pada mesin yang tidak memiliki set variabel lingkungan yang tepat.tmux 3.0a atau yang lebih lama pada mesin jarak jauh
Hampir sama seperti di atas, tetapi ganti baris terakhir menjadi³:
¹ Pada 2020-10-29, daftar pengiriman distribusi dengan tmux 3.1 atau yang lebih baru sudah cukup lama.
²
new
adalah kependekan darinew-session
.³
at
adalah kependekan dariattach-session
.Metode alternatif menggunakan file remote
authorized_keys
:Jika Anda lebih suka tidak memiliki
~/.ssh/config
file karena alasan apa pun, atau ingin mesin jarak jauh memaksa mesin penghubung untuk terhubung ke / membuka sesi, tambahkan ini ke remote Anda~/.ssh/authorized_keys
:Ini akan, tentu saja, bekerja dari semua klien yang memiliki kunci pribadi yang sesuai terpasang, yang bisa menjadi naik atau turun, tergantung pada apa yang Anda inginkan. Ada risiko bahwa, jika terjadi kesalahan, mungkin tidak dapat tersambung lagi.
sumber
tmux at
bukantmux a
? Juga akan bijaksana untuk menggunakan sesi bernama untuk ini atau tmux akan melampirkan ke sesi "acak" yang ada saat masuk ke host.Ctrl+A
Ctrl+Z
.Ctrl-B
D
bekerja memperlakukan dibandingkanCtrl-B
Ctrl-Z
. Terima kasih!byobu adalah pembungkus berguna yang bagus untuk tmux / layar. Menghubungkan ke sesi yang ada jika ada atau membuat yang baru.
Saya menggunakannya dengan autossh yang dengan anggun menghubungkan kembali sesi ssh. Sangat disarankan jika terjadi masalah konektivitas yang terputus-putus.
sumber
Anda mungkin menemukan ini berguna - menggunakan ssh dalam satu loop dan menyambungkan kembali atau menyambung ke sesi tmux yang ada sehingga Anda memiliki cara yang bagus dan mudah diandalkan untuk menyambung kembali setelah pemadaman jaringan
sumber
Ini adalah salah satu yang benar-benar menciptakan pengalaman pengguna yang luar biasa. Ini secara otomatis memulai tmux setiap kali Anda membuka terminal (baik secara fisik maupun ssh). Anda dapat memulai pekerjaan Anda di satu perangkat, keluar dari terminal, dan melanjutkan di perangkat lain. Jika mendeteksi seseorang sudah dilampirkan ke sesi itu akan membuat sesi baru. Taruh di server , tergantung pada shell Anda
~/.zshrc
atau~/.bashrc
.if [[ -z "$TMUX" ]] ;then ID="$( tmux ls | grep -vm1 attached | cut -d: -f1 )" # get the id of a deattached session if [[ -z "$ID" ]] ;then # if not available attach to a new one tmux new-session else tmux attach-session -t "$ID" # if available attach to it fi fi
sumber
Saya tahu saya menghidupkan kembali utas lama tetapi saya telah melakukan beberapa pekerjaan pada solusi bashrc dan saya pikir itu ada gunanya:
Ada batasan pada 10 (11) sesi untuk saat ini - saya tidak ingin mematikan server saya dengan loop tak terbatas di bashrc. Tampaknya bekerja dengan cukup andal, selain kesalahan tmux yang gagal pada klien daftar jika sesi tidak ada.
sumber
Cara ini memungkinkan Anda untuk terhubung kembali ke instance tmux lama jika sesi ssh Anda menurun. The
exec
menyimpan garpu tentu saja.sumber