Mengapa ssh-agent tidak menyimpan kunci tidak terenkripsi saya untuk digunakan nanti?

12

Setiap kali saya SSH ke server lain dari server Ubuntu tanpa kepala saya saya diminta kata sandi untuk file kunci saya. Bahkan jika saya sebelumnya sudah terhubung ke server.

Apakah Anda tahu mengapa ini mungkin? Bisa jadi sesuatu yang sederhana seperti ssh-agenttidak berjalan saat ini atau sesuatu.

Kunci yang sama pada desktop Ubuntu Gnome saya berfungsi dengan baik. Server dan desktop menjalankan Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
sumber
1
Pertama, seperti yang Anda katakan, periksa apakah ssh-agentberjalan:ps -ef | grep '[s]sh-agent'
Scott Severance
@mssever Ya sepertinya. Lihat pertanyaan terbaru.
Treffynnon

Jawaban:

10

Sekalipun agen naik, jika variabel lingkungan tertentu tidak disetel, Anda tidak memiliki referensi ke agen. Selain itu, bahkan jika itu semua ok, agen dan variabel, identitas tidak secara otomatis dikirim ke agen: itu adalah tugas ssh-askpass, hanya bekerja dalam sesi X.

Jika Anda menggunakan bash, buat file ~/.bash_profiledengan konten ini:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

modifikasi nama file ~/.ssh/id_dsasesuai kebutuhan Anda, dan tambahkan baris ini ke~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Catatan terakhir: ini tidak mengganggu sesi gnome, karena dalam kasus ini hanya ~/.profilebersumber, dan Anda bisa mendapatkan manfaat dari ssh-askpassantarmuka grafis yang meminta frasa sandi dan mengirimkannya ke ssh-agent.

enzotib
sumber
Terima kasih @enzotib kerjanya sangat bagus untuk sshmasuk ke mesin lain. Tetapi tidak ketika menggunakan gituntuk mendorong atau menarik repositori publik. Apakah Anda punya ide bagaimana saya bisa menyelesaikannya juga?
Treffynnon
Tambahkan fungsi yang identik dengan ssh(), panggil git()dan ubah baris terakhir dari /usr/bin/sshmenjadi /usr/bin/git. Juga, tambahkan baris terakhir dengan export -f git.
enzotib
@enzotib saya mencobanya, tetapi sekarang ketika saya sshmasuk ke mesin dengan bash_profilefile yang Anda buat di atas, ia meminta saya untuk memasukkan kata sandi kunci. Untuk beberapa alasan sekarang setiap kali saya ssh di dalamnya meminta bahkan sebelum saya telah dieksekusi sshatau git. Lihat gist.github.com/942082 untuk konfirmasi yang saya dapatkan kembali ketika saya login ke mesin yang menyinggung.
Treffynnon
@ Treffynnon: Saya tidak tahu persis bagaimana gitberinteraksi ssh, dan saya tidak menggunakannya gitsehingga saya tidak bisa mencoba. Saya memodifikasi ~/.bash_profileuntuk memasukkan git()fungsi yang saya sebutkan di atas, untuk memastikan penjelasan saya sebelumnya jelas. Juga, tampaknya dari output yang Anda tunjukkan bahwa Anda memodifikasi mesin server, tetapi semua saran saya diarahkan ke mesin klien saja.
enzotib
@enzotib Itu benar. Server yang saya masuki menjadi klien saya ketika saya gitmendorong ke forge / repositori pusat sehingga file berada di tempat yang tepat. Saya pikir Anda baru saja memberi saya petunjuk / berlari pikiran saya. Saya memiliki prompt bash khusus yang menampilkan cabang git dari pwd. Saya yakin itulah yang memicu permintaan kata sandi di bash login karena mencoba untuk mendapatkan stat sebelum rendering bash prompt!
Treffynnon
2

Saya baru-baru ini mulai menggunakan ssh-ident:

https://github.com/ccontavalli/ssh-ident

Yang harus Anda lakukan adalah menambahkan sesuatu seperti:

alias ssh="/path/to/ssh-ident"

di Anda .bashrc. Atau, Anda dapat ln -s /path/to/ssh-ident ~/bin/sshatau direktori lain di PATH Anda sebelum /bindan /usr/bin.

rabexc
sumber