Bagaimana menghindari frasa yang diminta setiap kali saya mendorong ke Bitbucket

217

Saya mengatur barang-barang ssh saya dengan bantuan panduan ini , dan itu berfungsi dengan baik (saya bisa berlari hg pushtanpa diminta passphrase). Apa yang bisa terjadi antara dulu dan sekarang, mengingat saya masih menggunakan direktori home yang sama.

$ cat .hg/hgrc 
[paths]
default = ssh://[email protected]/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://[email protected]/tshepang/bloog
searching for changes
...
tepang
sumber

Jawaban:

337

Anda perlu menggunakan agen ssh. Jawaban singkat: coba

$ ssh-add

sebelum mendorong. Berikan frasa sandi Anda saat diminta.

Jika Anda belum menjalankan ssh agent, Anda akan mendapatkan pesan berikut:

Could not open a connection to your authentication agent.

Dalam situasi itu, Anda dapat memulai dan mengatur lingkungan Anda dengan demikian

eval $(ssh-agent)

Kemudian ulangi ssh-addperintahnya.

Layak untuk melihat halaman agen ssh .

jmtd
sumber
2
Apa gunanya evalAnda bisa mengetik ssh-agent?
James McMahon
4
Ini menampilkan beberapa perintah yang memungkinkan Anda untuk menggunakannya, dan tidak menjalankannya untuk Anda; evalapakah excuting.
tshepang
Tidak terkait dengan pertanyaan asli tetapi jika Anda terus memiliki masalah ini di GitHub, Bitbucket dll, pastikan Anda menggunakan URL git / ssh, bukan http, yang akan terus menanyakan nama pengguna + kata sandi.
Czechnology
Dan jika Anda tidak memiliki kunci default, atau ingin menambahkan banyak,ssh-add /path/to/key
hoosierEE
46

Cara untuk mengatasi ini adalah dengan ssh-agentdan ssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

Setelah ini frasa sandi disimpan untuk sesi saat ini. dan tidak akan ditanya lagi.

stefano
sumber
7
Kebanyakan orang sama sekali tidak ingin disadap karena frasa pass mereka.
connexo
26

Saya menggunakan Keychain untuk mengelola kunci ssh. Ini juga tersedia di Debian dan mungkin dengan Ubuntu

apt-get install keychain

Ini adalah halaman paket gantungan kunci Debian . Seperti yang Anda lihat, proyek ini tidak terlalu aktif, tetapi bekerja untuk saya. Saya juga berkomentar sedikit tentang ini di jawaban lain di sini

Faheem Mitha
sumber
2
//, Ini berhasil untukku. Ini jauh lebih baik daripada ssh-agent, karena saya tidak perlu memasukkan kata sandi kunci ssh setiap kali saya membuka terminal .
Nathan Basanese
@NathanBasane apakah Anda mengatakan bahwa menggunakan gantungan kunci Anda tidak perlu memasukkan kata sandi kunci ssh setiap kali Anda membuka terminal? Bagaimana Anda mengonfigurasinya? karena gantungan kunci terus menanyakan kata sandi setiap kali saya membuka terminal, hanya saja pertama kali saya membukanya setelah booting, tapi tetap saja. Saya tidak ingin memasukkan frasa sandi setiap saat.
m4l490n
@ m4l490n Tidak, jika Anda menggunakan gantungan kunci, Anda tidak perlu memasukkan kata sandi kunci ssh setiap kali Anda membuka terminal. Tetapi Anda harus memasukkannya satu kali setelah booting. Frasa sandi tidak disimpan ke disk - itu tidak aman.
Faheem Mitha
Bagi saya, itu meminta setiap kali saya masuk (saya punya repositori git + kunci ssh di server jarak jauh dan setiap kali saya melakukan "git pull", saya harus memasukkan frasa sandi)
Martin Thoma
@ MartinThoma Itu terlihat salah. Pastikan Anda telah mengkonfigurasi .ssh dengan benar. Secara khusus, apakah shell Anda dikonfigurasi dengan benar? Jika itu masih tidak berhasil untuk Anda dan Anda tidak dapat menemukannya, Anda dapat mengajukan pertanyaan.
Faheem Mitha
13

Buat (atau edit jika ada) file ~ / .ssh / config berikut:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
ness-EE
sumber
Tapi saya menggunakan sepasang kunci yang berbeda untuk setiap layanan ...
connexo
@connexo Anda dapat mengganti tanda bintang wildcard dengan nama host individual Anda dan 'id_rsa' dengan kunci pribadi yang sesuai
ness-EE
1
Saya perlu menambahkan IgnoreUnknown AddKeysToAgent,UseKeychaintepat di atas UseKeychain yes.
consideRatio
1
Saya mendapatkan kesalahan ini: "Opsi konfigurasi buruk: usekeychain" pada baris "UseKeychain ya".
m4l490n
@ m4l490n: sepertinya UseKeychainopsi telah ditambahkan di OpenSSH 7.1p2 (2016-02-28). Mungkin Anda memiliki versi sebelumnya. openssh.com/txt/release-7.2
chus
6

Untuk kenyamanan, metode optimal adalah kombinasi dari jawaban jmtd dan Faheem .

Menggunakan ssh-agentsendiri berarti bahwa instance baru ssh-agentperlu dibuat untuk setiap terminal baru yang Anda buka. keychainketika diinisialisasi akan meminta frasa sandi untuk kunci pribadi dan menyimpannya. Dengan begitu kunci pribadi Anda dilindungi kata sandi tetapi Anda tidak perlu memasukkan kata sandi berulang kali.

The Arch wiki merekomendasikan inisialisasi gantungan kunci dari /etc/profile.d/atau profil shell Anda, seperti .bash_profileatau .bashrc. Ini memiliki kelemahan karena intializes gantungan kunci Anda segera setelah Anda membuka terminal.

Pendekatan yang lebih fleksibel adalah menggabungkan keychaindengan tmuxsesi tertentu . Jadi, di .bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... dan kemudian itu hanya kasus memulai tmuxsesi aman saat dan ketika diperlukan (diluncurkan dari keybind):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

Sekarang, gantungan kunci Anda hanya akan diinisialisasi satu kali ketika Anda memulai tmuxsesi khusus itu . Selama sesi itu berlanjut, Anda akan dapat mengakses sshkunci - kunci itu dan mendorong ke repositori jarak jauh Anda.

jasonwryan
sumber
Bagaimana saya membuatnya bekerja pada mesin jarak jauh? Saya memodifikasi skrip kedua untuk memeriksa $ SSH_CLIENT dan jika ada, jangan jalankan urxvtc, cukup tmux. Itu bekerja, tetapi masalahnya adalah bagian .bash_profile. Ketika saya pertama kali masuk ke kotak itu mengatakan "server tidak ditemukan: Sambungan ditolak" yang merupakan output dari "tmux ls". Kemudian, ketika saya menjalankan skrip kedua, tmux memulai sesi baru atau menempel pada yang sudah ada, tetapi tidak ada prompt gantungan kunci. Lalu, ketika saya keluar dari sesi, prompt gantungan kunci ada di sana menunggu.
jonyamo
Saya telah memperbarui jawaban untuk membisukan output tmux jika tidak ada sesi.
jasonwryan
Terima kasih, tapi itu masih belum menyelesaikan masalah dengan gantungan kunci. tmux membuat sesi baru tapi langsung ke prompt kosong apa pun. Hanya ketika saya keluar dari sesi tmux saya melihat prompt keychain meminta frasa sandi saya.
jonyamo
Saya kira saya harus berhenti mengatakan gantungan kunci, karena gantungan kunci hanya dijalankan di .bash_profile. Masalahnya adalah dari mengeksekusi ssh-add. Meskipun, jika saya menjalankan ssh-add secara manual setelah membuat sesi tmux, ia berfungsi.
jonyamo
1
Lewati skrip kedua dan mulai saja sesi tmux Anda yang aman .profile- dengan begitu Anda akan mendapatkan prompt untuk kunci begitu Anda masuk.
jasonwryan
0

Anda bisa menggunakan sshpass:

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

Anda hanya perlu menambahkan sshpass -p yourpassphrasesebelum menambahkan sshperintah biasa Anda .

belka
sumber
2
Itu terdengar seperti ide yang sangat bodoh. Bukankah itu membuat kata sandi Anda muncul dalam teks yang jelas dalam riwayat shell Anda?
connexo
Tepat, tetapi apakah Anda tidak seharusnya melindungi sesi Anda dengan kata sandi juga?
belka
1
Bahkan jika Anda melakukannya, seberapa sering Anda memiliki seorang kolega duduk di sebelah Anda dan membantu Anda / belajar dari Anda?
connexo