1) Dalam skrip rc SSH Anda (~ / .ssh / rc), Anda akan mengatur tautan simbolis dari lokasi kanonik ke SSH_AUTH_SOCK "saat ini". Inilah cara saya melakukannya di bash (konten ~ / .ssh / rc):
#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
(dan pastikan untuk chmod 755 ~ / .ssh / rc). "Tes" hanya untuk mencegah kesalahan menampilkan jika Anda tidak menjalankan ssh-agent (yaitu Anda ssh tanpa -A). Bagian kedua dari perintah itu mengatur symlink di lokasi kanonik yang memperbarui dirinya ke SSH_AUTH_SOCK "asli" pada saat masuk. Ini independen dari menggunakan shell di ssh atau langsung memanggil perintah, berfungsi juga dengan "ssh -t screen -RRD".
Catatan: keberadaan ~ / .ssh / rc mengubah perilaku sshd. Khususnya, itu tidak akan memanggil xauth. Lihat man sshd untuk informasi lebih lanjut, dan cara memperbaikinya.
Selain itu, Anda tidak boleh menggunakan "-v" dengan ln segera setelah itu akan memecah rsync-over-ssh dengan diagnostik berikut:
$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
2) Di .screenrc Anda, Anda hanya perlu mengganti SSH_AUTH_SOCK ke lokasi kanonik:
setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Perhatikan bahwa Anda menggunakan setenv tidak peduli apa shell yang Anda gunakan; Saya pikir setenv adalah sintaks layar, bukan shell.
Solusi awalnya diadaptasi dari pos ini , yang tidak berfungsi, tetapi memiliki ide yang tepat.
Saya pikir ini berfungsi sebagai penyederhanaan jawaban @ sandip-bhattacharya. Masukkan ini di
~/.bashrc
file Anda , dan jalankan perintah ekspor di sesi layar yang sedang berjalan.Bunyinya "jika
$SSH_AUTH_SOCK
soket (-S
) dan bukan tautan simbolik (! -h
), buat tautan simbolik baru di jalur yang diketahui. Dalam semua kasus, tentukan ulangSSH_AUTH_SOCK
untuk menunjuk ke jalur yang dikenal.The
! -h
Menghindari menciptakan referensi melingkar jika Anda menjalankan ini beberapa kali.Juga, jika Anda menggunakannya
byobu
, ini dilakukan secara otomatis, tanpa perlu mengedit file konfigurasi.Satu-satunya bug yang saya temukan dalam ini (
byobu
memilikinya juga) adalah jika Anda membuka satu detikssh -A
atauForwardAgent
koneksi itu akan menimpa soket pertama, dan jika Anda menutup koneksi kedua sebelum yang pertama, Anda akan kehilangan satu-satunya soket yang baik.sumber
tmux
.~/.ssh/ssh_auth_sock_"$(hostname)"
untuk symlink Anda. Ini akan menjaga soket auth terpisah untuk setiap host."ssh -t some.machine screen -R" tidak akan menjalankan bash dan karenanya tidak akan menjalankan skrip .bash_profile tempat symlink dibuat.
Anda dapat mencoba: ssh -t some.machine bash -c "screen -R"
(dengan asumsi Anda menggunakan bash sebagai shell Anda tentu saja)
Sunting: "Jawaban" itu sebenarnya adalah komentar atas jawaban pertama yang diberikan di atas :)
sumber
Saya pikir Anda perlu autossh. Saya telah menggunakannya selama bertahun-tahun sekarang, dan dikombinasikan dengan layar membuat semua sesi terminal saya sepenuhnya portabel dan transparan. Saya cukup tutup lappy, pindah ke lokasi baru, buka lappy dan semua layar saya dan layar bersarang terhubung secara otomatis. Aku bahkan tidak memikirkannya lagi.
http://www.linux.com/archive/feature/134133
adalah dasar-dasarnya ... Saya membuat skrip lil untuk mengotomatiskan proses di .screenrc saya untuk host yang diberikan. (juga melakukan ssh forwarding saya, jadi di semua tempat yang berbeda ini saya dapat melakukan tunnel koneksi saya melalui server saya)
di distro autossh harus ada program yang disebut rscreen (dan .. ada!)
Ini seharusnya membantu masalah ssh / layar
Akhirnya, untuk menjaga ssh-agent saya tetap berjalan, saya menggunakan gantungan kunci, karena saya semacam kepala shell ... Saya pikir OSX memiliki sesuatu yang tersedia untuk menjaga agen Anda tetap ada ...
sumber
Inilah metode yang saya gunakan:
Saya biasanya mengatur alias atau fungsi shell dengan perintah tesis:
Anda mungkin harus menyesuaikan ' layar - (r | DR) ' ekspresi reguler ke perintah persis yang Anda gunakan untuk memasang kembali layar Anda.
Peringatan dengan metode saya: ada yang tidak beres jika ada perintah " layar " lain yang berjalan di komputer.
sumber
sudo
.Saya biasanya menjaga sesi jangka panjang (6+ bulan) berjalan di tempat kerja saya di server yang berbeda. Jadi berulang kali memasang kembali dan memiliki agen penerusan ssh yang layak telah bermasalah. Inilah yang saya atur di sistem saya:
Jika saya hanya masuk ke server jarak jauh tanpa memulai / memasang kembali layar, maka akan ada dua "soket", satu digunakan oleh
screen
dan yang lain oleh shell baru. Seharusnya tidak ada dua sesi "startup", tetapi sesi kedua masih bisa mulai digunakanreattach -S new
; dalam situasi ini, agen akan dibagikan dengan~/.ssh/agent-screen
nilai. Untuk mendapatkan agen penerusan kembali, maka saya akan melepaskan, masuk kembali.X${USER} = Xmyusername
Memastikan bahwa kode tidak akan dipanggil melaluisudo
pada server yang sama.sumber
Saya menggunakan variasi dari apa yang @apinstein gunakan untuk .bashrc saya .
Ini berfungsi untuk semua aplikasi yang berjalan di sesi layar saya. Ini akan bekerja untuk semua shell baru di sesi layar Anda. Untuk shell yang ada, Anda perlu menjalankan
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
shell host untuk membuatnya bekerja.PS Maaf untuk menambahkan ini sebagai jawaban independen, sedangkan itu hanya dibangun di atas jawaban @ apinstein. Harus melakukan ini karena komentar di stackoverflow tidak mendukung blok kode.
sumber
Saya mencoba liner sederhana ini seperti yang disarankan pada Mari membuat teman layar dan ssh-agent dan itu bekerja untuk saya.
Login Pertama Kali ke Target. Perlu dilakukan hanya sekali.
Luncurkan Layar untuk pertama kalinya..perlu dilakukan hanya sekali.
Jika terlepas atau terputus, gunakan perintah ini untuk masuk selanjutnya untuk menghubungkan ke layar yang keluar.
sumber
Ini semua adalah jawaban yang sangat bagus. Saya melakukannya sedikit berbeda. Setelah saya memulai sesi ssh baru dan memasang kembali layar, saya mereset
SSH_AUTH_SOCK
variabel lingkungan berdasarkan pada isi dari lingkungan root bash. Saya hanya memerlukan akses ssh-agent sesekali ketika saya menggunakan svn jadi saya hanya mengatur ulangSSH_AUTH_SOCK
seperti yang diperlukan dalam shell ini.Ini menggunakan sistem file proc begitu spesifik linux. Saya hanya menguji ini pada kotak linux tanpa kepala yang hanya diakses oleh saya, mungkin perlu beberapa penyesuaian untuk membuatnya bekerja di lingkungan lain.
Untuk mengatur ulang SSH_AUTH_SOCK (ini dapat dibuat sebagai alias).
screen_auth.sh terlihat seperti ini
sumber
Semua solusi di atas menderita kondisi balap (baik dalam beberapa sesi SCREEN atau dalam beberapa koneksi SSH). Satu-satunya solusi universal yang dapat saya pikirkan adalah untuk pertama-tama mendorong SSH_AUTH_SOCK ke proses server SCREEN
screen -r
dan kemudian menariknya di dalam sesi BASH sebelum setiap perintah interaktif non-builtin. Sayangnya SCREEN dan BASH dirancang tanpa kesadaran akan masalah seperti itu, sehingga agak sulit untuk diterapkan dengan benar (meskipun tidak pernah terlambat untuk mengirim permintaan fitur ke kedua proyek). Upaya saya dilakukan untuk mengatasi masalah ini untuk sesi BASH yang dapat ditemukan di sini:Untuk memasang:
$HOME/bin
, tambahkan bit yang dapat dieksekusi;pastikan itu
$HOME/bin
berjalan sebelum/usr/bin
di PATH:PATH = $ HOME / bin: $ PATH
tambahkan ini ke
.bashrc
:source $ HOME / bin / setup layar pembantu
Sekarang Anda dapat mencoba membuat sesi LAYAR di dalam sesi SSH, lepaskan, putuskan, sambungkan dan pasang kembali dan semoga
ssh-add -l
menunjukkan kunci Anda dengan benar.sumber
ssh-agent
daemon permanen itu (seperti yang disarankan di sini superuser.com/a/412052/376867 ) tidak menderita kondisi balap, tetapi menderita keyring basi. Dan yang lebih penting, tidak terlalu aman untuk meninggalkan semua kunci Anda di host jarak jauh bersama dengan sesi layar (atau bahkan lebih lama sampai reboot jika ada tulisan yang disebutkan).Saya membaca jawaban-jawaban lain dan tidak menemukan jawaban saya. Inilah yang saya gunakan. Buat file
~/.screenrc-wrapper
dengan konten berikut:Dan tambahkan ini ke
~/.bashrc
(atau~/.zshrc
jika Anda menggunakannya):Dengan cara ini Anda akan menggunakan dua sesi layar - satu adalah "pembungkus" dan satu adalah bagian dalam. Ini akan membuat yang terakhir tetap hidup bahkan ketika Anda logout dan itu akan tetap memiliki ssh-agent. Fitur bagus lainnya adalah ia akan mengingat pengaturan jendela Anda - jika Anda menggunakan split windows, ini mungkin sangat berguna.
Anda dapat menemukan fitur ini dalam konteks di dotfiles saya .
sumber