Apakah ada cara mudah untuk memastikan bahwa semua login dari pengguna yang diberikan (yaitu saya) menggunakan ssh-agent yang sama? Saya meretas naskah untuk membuat pekerjaan ini sebagian besar waktu, tapi saya curiga selama ini ada beberapa cara untuk melakukannya yang baru saja saya lewatkan. Selain itu, sejak saat itu telah ada kemajuan luar biasa dalam teknologi komputasi, seperti misalnya situs web ini.
Jadi tujuannya di sini adalah itu
- setiap kali saya masuk ke kotak, terlepas dari apakah itu melalui SSH, atau dalam sesi grafis dimulai dari gdm / kdm / etc, atau di konsol:
- jika nama pengguna saya saat ini tidak
ssh-agent
berjalan, satu dimulai, variabel lingkungan diekspor, danssh-add
dipanggil. - jika tidak, koordinat agen yang ada diekspor dalam variabel lingkungan sesi login.
- jika nama pengguna saya saat ini tidak
Fasilitas ini sangat berharga ketika kotak tersebut digunakan sebagai titik relai ketika ssh
masuk ke kotak ketiga. Dalam hal ini ia menghindari keharusan mengetikkan frasa sandi kunci pribadi setiap kali Anda melakukan ssh dan kemudian ingin, misalnya, melakukan git push
atau sesuatu.
Script yang diberikan di bawah ini melakukan hal ini sebagian besar andal, meskipun gagal baru-baru ini ketika X crash dan saya kemudian memulai sesi grafis lainnya. Mungkin ada kelicikan lain yang terjadi dalam contoh itu.
Ini skrip buruk-baik-saya. Saya sumber ini dari .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Tolong beritahu saya ada cara yang lebih baik untuk melakukan ini. Juga tolong jangan lihat ketidakkonsistenan / kesalahan (mis. Memasukkan var
barang ke dalam etc
); Saya menulis ini beberapa waktu lalu dan sejak itu belajar banyak hal.
Jawaban:
Saya mungkin juga memasukkan variasi saya sendiri ke dalam campuran:
Dan kemudian setiap kali saya masuk, jika saya ingin agen terlampir (yang saya tidak selalu), saya ketik saja
sagent
.sumber
if [ ! -x "$(which ssh-add)" ];
harus diganti denganif ! which ssh-add;
atauif ! command -v ssh-add
. (Ingat,[
ini hanya perintah)if ! which ssh-add > /dev/null
mencegah jalannya dicetak, pada titik mana saya tidak begitu yakin itu lebih jelas, meskipun saya kira itu tidak menyelamatkan Anda satu permintaan perintah tambahan.ssh -A [user@]remotehost
Saya pikir ini mungkin yang Anda cari. Gunakan sakelar -A saat menjalankan ssh forward ssh-agent Anda. Berikut ini usecase:
Saya memiliki server jarak jauh yang memiliki beberapa repositori git dengan remote yang menunjuk ke github. Tanpa ssh-agent berjalan dalam sesi layar, saya harus memasukkan frasa sandi untuk kunci saya untuk melakukan "git pull origin master". Booo! Selain itu, saya harus menginstal kunci pribadi saya di server jauh - Boooo lagi!
Sebagai gantinya, cukup menggunakan
ssh -A [user@]remotehost
pass di sepanjang ssh-agent saya yang berjalan secara lokal. Sekarang, saya tidak lagi memerlukan kunci pribadi saya untuk bahkan ada di host jarak jauh. Saya tidak percaya Anda perlu melakukan skrip sama sekali dengan ssh-agent.sumber
man 5 ssh_config
untukForwardAgent
pengaturan konfigurasi. Ini memungkinkan penerusan agen secara default, menghilangkan kebutuhan untuk-A
argumen. Sebelum menggunakan penerusan agen, ketahui bahwa ada risiko keamanan di mana pengguna istimewa lainnya pada mesin jarak jauh dapat mengakses soket agen yang diteruskan. Ini juga disebutkan di halaman manual. Ini dijelaskan dengan baik di sini .Inilah yang cukup bagus yang bekerja di Cygwin juga:
Tambahkan ke .bash_profile atau .bashrc Anda
Sumber: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
sumber
${SSH_ENV}
perlu"${SSH_ENV}"
jika nama pengguna windows Anda memiliki ruang di dalamnyaCoba gunakan gantungan kunci, itu dibuat untuk itu. http://www.gentoo.org/doc/en/keychain-guide.xml
sumber
Saya baru-baru ini mulai menggunakan:
https://github.com/ccontavalli/ssh-ident
Yang harus saya lakukan adalah menambahkan:
Dalam file .bashrc saya. Skrip menangani:
sumber
Saya lebih suka menjaga hal-hal sesederhana mungkin: (cuplikan dari
~/.profile
)Saya tidak berpikir untuk menggunakan
-a
sebelumnya, tetapi mungkin lebih mudah:sumber
Dalam kasus saya, saya memiliki pengaturan posh-git di PowerShell dan ingin cygwin menggunakan ssh-agent yang sama. Saya harus melakukan manipulasi path karena mereka menggunakan folder tmp yang berbeda, dan file .env yang dibuat adalah UTF16 dengan BOM dan CR \ LF sehingga menyenangkan untuk ditangani. Menambahkan berikut ini ke .bashrc yang digunakan oleh cygwin seharusnya berfungsi:
sumber
Sekali lagi contoh untuk dimasukkan ke dalam .bash_profile Anda segera dan meminta untuk menambahkan kunci default Anda saat masuk. Penerusan bukan opsi dalam kasus saya.
sumber
Ini solusi saya, diadaptasi dari https://superuser.com/a/141233/5255 (di utas ini):
sumber
buat file ~ / ssh-agent.sh
termasuk file dalam .bashrc
sumber
Ini adalah sesuatu yang saya tambahkan yang berfungsi untuk saya. Pertama-tama memeriksa untuk melihat apakah Anda memiliki agen berjalan, jika ya itu akan mengatur lingkungan yang tepat untuk itu, jika tidak itu akan membuatnya. Juga menghilangkan pembuatan agen tambahan:
Masukkan saja ke dalam
.bashrc
sumber
Saya memiliki variasi pada masalah ini, juga diambil langsung dari .bashrc saya:
Solusi ini menyimpan salinan informasi agen SSH di direktori home Anda. Jika Anda memiliki direktori home NFS-automounted yang mungkin dibagikan di antara banyak host, nama host digunakan sebagai bagian dari nama file untuk membedakannya, jadi masuk dari satu mesin tidak akan mengganggu file agen yang digunakan pada yang lain.
Tingkah laku:
1) Sesi pengguna pertama kali diminta untuk frasa sandi utama.
2) Sesi kedua, ketiga dan keempat (dan lain-lain) mewarisi agen dan kunci SSH yang ditambahkan pada yang pertama.
3) Jika agen terbunuh atau lumpuh, sesi berikutnya pertama akan membuat agen baru, menimpa file agen dengan yang baru - dan meminta kata sandi kunci lagi. Sesi yang dibuat selanjutnya akan berperilaku seperti skenario 2), selama agen SSH baru tetap berjalan.
sumber
(ini merujuk pada posting 2 yang lebih tinggi, saya tidak dapat menambahkan komentar)
@ raghavan: Contoh Anda bermanfaat, tetapi akan menyarankan untuk mengubah dua baris yang ada
pgrep ssh-agent
untuk
pgrep -u $ USER ssh-agent> / dev / null
sehingga hanya agen yang berjalan di bawah pengguna saat ini yang ditemukan, dan pid tidak bergema ke layar (bersih).
Juga disarankan untuk mengubah $ HOME / ssh-agent.out menjadi $ HOME / .ssh-agent.out
Salam
sumber
Saya membaca solusi asli Anda dan sejumlah yang disarankan, tetapi memutuskan untuk menyederhanakan prosesnya untuk saya gunakan sendiri. Ini yang saya tambahkan di .bashrc saya sendiri:
Saya telah membuat beberapa asumsi di sini:
Secara keseluruhan saya pikir ini terasa seperti solusi sederhana.
sumber
Saya menemukan bahwa saya sering menjalankan banyak
ssh-agent
proses, dan PID di dalam nama file soket tidak pernah benar-benar cocok dengan PID yang sedang berjalanssh-agent
, jadi saya meretas sesuatu untuk mencoba memulihkan dari kondisi ini, berdasarkan banyak contoh di atas.Ini adalah fungsi tunggal, ia menggunakan variabel Zsh untuk ID pengguna jika ada di sana, dan mencoba menghabiskan lebih sedikit waktu untuk mem-parsing
/tmp
direktori yang mungkin sangat besar dengan membatasifind(1)
sedikit lebih banyak.Mungkin masih rawan kesalahan, dan berbelit-belit, tetapi beberapa tes sepintas menunjukkan sebagian besar berfungsi untuk kasus penggunaan saya, jadi begini:
sumber
Inilah putaran saya tentang ini. Saya ' sumber ' skrip di bawah ini dari .bash_profile saya :
sumber
Berikut ini skrip sederhana yang akan selalu menggunakan kembali ssh-agent yang sama, atau memulai ssh-agent jika tidak berjalan. Kuncinya adalah menggunakan
-a
opsi untuk menggunakan nama soket yang sama. Jika tidak, secara default akan memilih nama soket acak setiap kali. Anda dapat dengan mudah menggabungkan 3 baris ini menjadi alias 1 baris juga.sumber
sumber