Bagaimana saya bisa menjalankan ssh-add secara otomatis, tanpa prompt kata sandi?


248

Saya ingin berkomunikasi antara beberapa komputer di jaringan saya (Ethernet statis), melalui SSH. Untuk melakukan itu saya perlu menjalankan ssh-add setiap kali saya masuk pada mesin tertentu, bagaimana saya bisa melakukannya sehingga sudah diatur sekali dan tidak meminta saya untuk frasa sandi setiap kali saya masuk atau reboot mesin saya?

Saya tahu bahwa ada cara Anda harus menambahkan beberapa baris ke bash_profilefile, tetapi saya masih perlu mengetikkan kata sandi setiap kali saya reboot / masuk ke mesin tertentu.

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

Jawaban:


348

Ini adalah contoh khas dari pertukaran antara keamanan dan kenyamanan. Untungnya ada sejumlah opsi. Solusi yang paling tepat tergantung pada skenario penggunaan dan tingkat keamanan yang diinginkan.

ssh-key dengan frasa sandi, no ssh-agent

Sekarang frasa sandi harus dimasukkan setiap kali kunci digunakan untuk otentikasi. Meskipun ini adalah opsi terbaik dari sudut pandang keamanan, ia menawarkan kegunaan terburuk. Ini juga dapat menyebabkan frasa sandi yang lemah dipilih secara berurutan - untuk mengurangi beban memasukkannya berulang kali.

ssh-key dengan frasa sandi, dengan ssh-agent

Menambahkan yang berikut ini ~/.bash_profileakan secara otomatis memulai ssh-agentdan memuat kunci ssh saat login:

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

Sekarang frasa sandi harus dimasukkan pada setiap login. Meskipun sedikit lebih baik dari perspektif kegunaan, ini memiliki kelemahan yang ssh-agentmeminta frasa sandi terlepas dari apakah kunci akan digunakan atau tidak selama sesi login. Setiap login baru juga memunculkan ssh-agentinstance berbeda yang tetap berjalan dengan kunci yang ditambahkan dalam memori bahkan setelah logout, kecuali jika dibunuh secara eksplisit.

Untuk membunuh ssh_agentsaat keluar, tambahkan yang berikut ke~/.bash_logout

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

atau yang berikut ke ~/.bash_profile

trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0

Membuat banyak ssh-agentcontoh dapat dihindari dengan membuat soket komunikasi persisten ke agen di lokasi tetap dalam sistem file, seperti dalam jawaban Collin Anderson . Namun, ini merupakan peningkatan dari pemunculan beberapa agen, kecuali jika secara eksplisit membunuh kunci yang didekripsi masih tetap ada dalam memori setelah keluar.

Pada desktop, ssh-agent yang disertakan dengan lingkungan desktop, seperti Gnome Keyring SSH Agent , bisa menjadi pendekatan yang lebih baik karena mereka biasanya dapat dibuat untuk meminta frasa sandi saat pertama kali ssh-key digunakan saat sesi login dan menyimpan kunci privat yang didekripsi dalam memori sampai akhir sesi.

ssh-key dengan frasa sandi, dengan ssh-ident

ssh-identadalah utilitas yang dapat mengelola ssh-agentatas nama Anda dan memuat identitas yang diperlukan. Ia menambahkan kunci hanya sekali sesuai kebutuhan, terlepas dari berapa banyak terminal, ssh atau sesi login yang memerlukan akses ke ssh-agent. Itu juga dapat menambah dan menggunakan agen yang berbeda dan set kunci yang berbeda tergantung pada host yang terhubung, atau direktori ssh dipanggil. Ini memungkinkan untuk mengisolasi kunci ketika menggunakan penerusan agen dengan host yang berbeda. Ini juga memungkinkan untuk menggunakan beberapa akun di situs-situs seperti GitHub.

Untuk mengaktifkan ssh-ident, instal dan tambahkan alias berikut ke Anda ~/bash_profile:

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

ssh-key dengan frasa sandi, dengan keychain

keychainadalah utilitas kecil yang mengelola ssh-agentatas nama Anda dan memungkinkannya ssh-agenttetap berjalan saat sesi login berakhir. Pada login selanjutnya, keychainakan terhubung ke ssh-agentinstance yang ada . Dalam praktiknya, ini berarti frasa sandi harus dimasukkan hanya selama login pertama setelah reboot. Pada login berikutnya, kunci yang tidak dienkripsi dari ssh-agentinstance yang ada digunakan. Ini juga dapat berguna untuk memungkinkan otentikasi RSA / DSA crontanpa kata sandi dalam pekerjaan tanpa kunci ssh tanpa kata sandi.

Untuk mengaktifkan keychain, instal dan tambahkan sesuatu seperti berikut ke ~/.bash_profile:

eval `keychain --agents ssh --eval id_rsa`

Dari sudut pandang keamanan, ssh-identdan keychainlebih buruk daripada ssh-agentkejadian terbatas pada masa hidup sesi tertentu, tetapi mereka menawarkan tingkat kenyamanan yang tinggi. Untuk meningkatkan keamanan keychain, beberapa orang menambahkan --clearopsi untuk ~/.bash_profilepermintaan gantungan kunci mereka . Dengan melakukan frasa sandi ini harus dimasukkan kembali saat login seperti di atas, tetapi cronpekerjaan masih akan memiliki akses ke kunci yang tidak dienkripsi setelah pengguna logout. The keychain halaman wiki memiliki informasi lebih lanjut dan contoh.

ssh-key tanpa frasa sandi

Dari sudut pandang keamanan, ini adalah opsi terburuk karena kunci privat sepenuhnya tidak terlindungi jika terbuka. Namun, ini adalah satu-satunya cara untuk memastikan bahwa frasa sandi tidak perlu dimasukkan kembali setelah reboot.

ssh-key dengan frasa sandi, dengan ssh-agent , meneruskan frasa sandi ke ssh-add dari skrip

Meskipun mungkin tampak seperti ide langsung untuk meneruskan frasa sandi ssh-adddari sebuah skrip, misalnya echo "passphrase\n" | ssh-add, ini tidak setegas yang sepertinya ssh-add tidak membaca frasa sandi stdin, tetapi membuka /dev/ttylangsung untuk membaca .

Hal ini dapat bekerja di sekitar dengan expect, alat untuk mengotomatisasi aplikasi interaktif. Di bawah ini adalah contoh skrip yang menambahkan kunci ssh menggunakan frasa sandi yang disimpan dalam skrip:

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

Perhatikan bahwa frasa sandi disimpan dalam plaintext dalam skrip, dari perspektif keamanan, ini hampir tidak lebih baik daripada memiliki ssh-key tanpa kata sandi. Jika pendekatan ini akan digunakan, penting untuk memastikan bahwa expectskrip yang berisi frasa sandi memiliki izin yang tepat, membuatnya dapat dibaca, dapat ditulis, dan hanya dapat dijalankan oleh pemilik kunci.


1
Oke, tapi ketika saya memasukkan kode Anda ke ~ / .bash_profile saya harus mengetikkan kata sandi setiap kali saya masuk, saya juga tidak mau itu. Saya tidak peduli dengan keamanan sama sekali. gema "lulus \ n" | ssh-add tidak berfungsi
zdun8

3
@ user1607072 Ya, begitulah ssh-agentcuplikannya ~/.bash_profileberperilaku seperti dijelaskan dalam jawaban. Anda mungkin ingin melihat keychainutilitasnya. Dengan keychainAnda harus memasukkan kata sandi pada login pertama setelah reboot, tetapi pada login berikutnya keychainakan terhubung ke ssh-agentinstance yang ada dengan kunci yang di-dekripsi dalam memori. Selain itu ada opsi untuk menghasilkan kunci ssh tanpa frasa sandi, tetapi ini tentu saja tidak disarankan.
Thomas Nyman

3
@ user1607072 Sementara saya akan sangat menyarankan salah satu pendekatan yang lebih aman, ada cara untuk meneruskan frasa sandi ssh-adddari skrip. Alasannya echo "pass\n" | ssh-addtidak bekerja adalah karena ssh-addtidak membaca kata sandi stdin, tetapi /dev/ttylangsung terbuka untuk membaca. Memperbarui jawaban untuk menyertakan solusi untuk ini, menggunakan utilitas yang disebut expect.
Thomas Nyman

1
@ user1607072 Mungkin agak berlebihan untuk kasus penggunaan Anda, tetapi Kerberos dalam kombinasi dengan dukungan ssh GSSAPI juga dapat digunakan untuk login ssh tanpa kata sandi. Metode otentikasi yang sesuai di ssh disebut gssapi-with-mic. Ini biasanya digunakan dalam jaringan yang lebih besar, tetapi tentu saja jika Anda memiliki minat dalam hal ini mungkin layak untuk dilihat.
Thomas Nyman

1
@ErickBrown: Sudah dijawab di sini . Unit Agen SSH harus dihentikan saat logout jika pengguna Anda tetap tidak aktif di manajer login systemd . Jika pengguna berlama-lama diaktifkan, instance pengguna systemd dan unit Agen SSH tetap berjalan bahkan setelah sesi login terakhir ditutup.
Thomas Nyman

93

Tambahkan ini ke Anda ~/.bashrc, lalu keluar dan kembali untuk memberi efek.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

Ini seharusnya hanya meminta kata sandi saat pertama kali Anda login setelah setiap reboot. Itu akan tetap menggunakan kembali sama ssh-agentselama itu tetap berjalan.


1
sangat rapi, dengan cara ini Anda hanya menjalankan satu ssh-agent (: Beberapa agen seperti dalam @ thomasNyman solusi kedua tampaknya risiko keamanan bagi saya ...
drevicko

1
Setelah meneliti di berbagai situs dan membaca berbagai solusi, yang ini di sini tampaknya yang paling jelas, langsung ke intinya. Sangat bagus. +1
Dr Beco

1
lebih baik melakukan ini: `alias ssh = ssh-check-agent", dan minta versi check-agent melakukan hal di atas. dengan cara itu: a) Anda hanya mendapatkan satu agen dan b) Anda hanya mendapatkan agen jika Anda membutuhkannya
Erik Aronesty

2
Saya pikir -s adalah default, jadi kami sudah melakukan itu.
Collin Anderson

1
ssh-add -lmengembalikan kode keluar 0 ketika agen memiliki identitas dan 1 ketika tidak sehingga Anda dapat memotong grep dari perintah terakhir dan menggunakanssh-add -l > '/dev/null' || ssh-add
Grant Humphries

16

Tidak terkait erat dengan pertanyaan OP, tetapi mungkin bermanfaat bagi orang lain: karena 7.2.0 ssh (1) memiliki opsi yang memungkinkan menambahkan kunci ke ssh-agent setelah otentikasi pertama; pilihan tersebut AddKeysToAgentdan dapat diatur untuk yes, no, ask, atau confirm, systemwide atau pribadi Anda .ssh/configberkas.

Referensi: https://www.openssh.com/txt/release-7.2


2
Berlaku untuk mereka yang baru .ssh/configmengenal file: ini berlaku untuk sshdan apa pun yang menggunakan di sshbelakangnya, misalnya scp, dan dapat dilakukan berdasarkan per-host.
SEoF

Itu masih meminta saya untuk kata sandi setiap kali saya masuk dan mencoba git pull misalnya.
trainoasis

@trainosis Masalahnya adalah bahwa Anda mungkin tidak menjalankan instance ssh-agent untuk menahan kunci yang didekripsi di memori untuk digunakan di masa mendatang. Anda hanya perlu memasukkan kata sandi untuk kunci yang diberikan sekali per sesi login saat menggunakan ssh-agent.
eestrada

7

ssh-agent men-cache berbagai kunci ssh yang tidak dikunci, sehingga Anda dapat memiliki kunci ssh yang dilindungi oleh kata sandi, tetapi tanpa harus mengetikkannya setiap saat.

Untuk melakukan cache kunci tidak terkunci, itu jelas perlu membuka kunci kunci itu. Untuk membuka kunci kunci yang dikunci dengan frasa sandi, jelas perlu mengetahui frasa sandi ini.

Metode apa pun yang tidak memerlukan otorisasi dari manusia (mis. "Mengetikkan kata sandi") tidak hanya akan membuat sistem Anda tidak aman; itu juga akan membuat seluruh tujuan ssh-agent menjadi tidak berarti.

Setelah mengatakan semua ini, Anda cukup menggunakan ssh-key yang tidak dilindungi kata sandi (tekan Entersaat ditanya kata sandi selama pembuatan kunci). Karena tidak ada kata sandi, ssh-agentAnda tidak perlu meminta kata sandi untuk (tidak) menyimpannya.


Saya setuju, selama kunci Anda hanya diizinkan oleh pengguna, ada sedikit keuntungan untuk ssh-agent dibandingkan kunci tanpa izin. Saya suka ssh ke server login, dan kemudian, server itu memiliki banyak kunci permssionless, yang masing-masing hanya dapat digunakan untuk membuka kunci satu server lain. server login tidak melakukan apa-apa lagi, jadi jauh lebih sulit untuk melakukan hack / spoof, dll ... server lain tidak memiliki akses kata sandi, hanya kunci.
Erik Aronesty

5

Ini adalah solusi untuk mengotomatiskan frasa sandi SSH Anda.

  1. Buat skrip satu baris yang mencetak frasa sandi Anda ke output standar, misalnya:

     echo 'echo MY_SSH_PASSWORD' > ~/.print_ssh_password && chmod 700 ~/.print_ssh_password
    

    Penting: Pastikan Anda menyalin ruang utama untuk mencegah penyimpanan kata sandi ke riwayat Anda .

Dan gunakan salah satu metode di bawah ini.

  • menggunakan pendekatan input standar:

    cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
    
  • atau pendekatan pipa bernama :

    1. Buat pipa bernama (Anda juga bisa mencoba substitusi proses ):

      mkfifo --mode 0600 ~/.ssh_fifo
      
    2. Jalankan ssh-adddengan menentukan program yang digunakan untuk otentikasi:

      cat ~/.ssh/id_rsa >~/.ssh_fifo | SSH_ASKPASS=~/.print_ssh_password ssh-add ~/.ssh_fifo
      

    Lihat: man ssh-adduntuk membaca lebih lanjut tentang SSH_ASKPASS.


2
Ini echo my_passphraseadalah lubang keamanan besar. Pertama setelah Anda mengetiknya, kata sandi dalam teks yang jelas dalam file sejarah apa yang pernah Anda gunakan. Dan argumen baris perintah kedua dapat dibaca dunia di Unix ( ps -ef). Jangan pernah memasukkan kata sandi dalam argumen baris perintah!
ceving

1
@ceving Menambahkan ruang tambahan tambahan memecahkan masalah dengan file histori. Menambahkan info tambahan.
kenorb

@kenorb: Itu tidak memecahkan masalah yang lebih besar dari kata sandi yang terlihat di psoutput. File histori biasanya hanya dapat dibaca oleh pengguna yang memiliki, tetapi baris perintah dapat dibaca oleh semua pengguna pada suatu sistem.
Thomas Nyman

4

Saya tidak akan merekomendasikan Anda ssh-add (yang perlu membuka ssh-agent) saat login. Ini karena Anda tidak dapat mengontrol kapan bagian ssh-agent berakhir, dan dapat membuat risiko keamanan ketika Anda tidak perlu menggunakan file keyfile pada satu bagian login.

Sebaliknya, saya sarankan untuk menulis skrip yang membuka sub-shell bagian ssh-agent, dengan semua keyfiles otomatis ditambahkan, dan dipanggil ketika diperlukan untuk menggunakan ssh. Jika Anda bisa mengadopsinya, baca terus.

Anda akan memiliki dua pilihan:

  1. Hapus semua frasa sandi untuk kunci Anda, yang memiliki keamanan lemah jika file kunci Anda dicuri. (dengan demikian tidak disarankan )

  2. Gunakan frasa sandi yang sama untuk kunci Anda. Maka ketika Anda ssh-add keyfile1 keyfile2 ..., Anda hanya perlu mengetikkan frasa sandi satu kali, per bagian.

Dalam kedua kasus, Anda dapat menulis file skrip seperti "ssh_keys_section.sh" seperti di bawah ini:

#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"

Catatan:

  • Perintah untuk mengubah atau menghapus frasa sandi: ssh-keygen -p -f keyfile
  • Di dalam sub-shell, Anda bahkan mungkin garpu lebih banyak terminal yang berbagi kunci tidak terkunci yang sama, dengan menggunakan mungkin perintah seperti /path/to/yourterminal &(tergantung pada OS)

Misalnya Pada Windows dalam Cygwin, /path/to/yourterminal &==>mintty &
Johnny Wong

2
if [ ! -S ${HOME}/.ssh/ssh_auth_sock ]; then
  eval $(ssh-agent)
  ln -sf "${SSH_AUTH_SOCK}" ${HOME}/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=${HOME}/.ssh/ssh_auth_sock

ssh_keys=$(find -E ~/.ssh -type f -regex '.*(rsa$|pem)')
ssh_agent_keys=$(ssh-add -l | awk '{key=NF-1; print $key}')

for k in "${ssh_keys}"; do
    for l in "${ssh_agent_keys}"; do
        if [[ ! "${k}" = "${l}" ]]; then
            ssh-add "${k}" > /dev/null 2>&1
        fi
    done
done

2

Saya dulu menggunakan script yang disebutkan oleh steampowered, saya sudah membuat yang di bawah ini sekarang, karena tidak meninggalkan file yang tergeletak di sekitar.

Bekerja zshhanya pada shell.

#!/bin/sh

AGENT_BIN=`which ssh-agent`
AGENT_ADD_BIN=`which ssh-add`
AGENT_PID=`ps -fe | grep ${AGENT_BIN} | awk -vuser=$USER -vcmd="$AGENT_BIN" '$1==user && $8==cmd{print $2;exit;}'`
if [ -z "$AGENT_BIN" ]; then
    echo "no ssh agent found!";
    return
fi
if [ "" -eq "$AGENT_PID" ]; then
    if read -sq "YN?Do you want to unlock your ssh keys?"; then
        echo ""
        output=`$AGENT_BIN | sed 's/echo/#echo/g'`
        eval $output
        $AGENT_ADD_BIN
    fi
else
    for f in "/proc/"*
    do
        cmdline=`cat "$f/cmdline"`
        if [ "${AGENT_BIN}" -ef "${cmdline}" ]; then
            export SSH_AUTH_SOCK=`cat $f/net/unix | grep --binary-file=text -oP '((/[^/]*?)+/ssh-[^/]+/agent\.\d+$)'`
            export SSH_AGENT_PID=${f##*/}
            break;
        fi
    done
fi

1
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

Memberikan kredit di sini: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html

Solusi ini juga didukung di sini: http://mah.everybody.org/docs/ssh


1

Solusi single sign on untuk SSH bisa menuntun saya pam_ssh.

Menurut artikel ini , konsepnya adalah:

Jika Anda bekerja dengan beberapa mesin berbasis * nix melalui ssh, Anda mungkin bosan harus memasukkan kata sandi setiap kali ingin mengakses kotak lain. Ada cara aman untuk memungkinkan Anda mengakses setiap mesin, yang Anda punya akses ssh, tanpa harus memasukkan kata sandi lain (selain yang Anda masuki awalnya.)


Ini sebenarnya cukup sederhana untuk dilakukan, pada dasarnya Anda hanya membuat pasangan kunci publik / pribadi untuk mengotentikasi diri Anda ke mesin lain, lalu minta PAM menelurkan agen untuk memuat kunci Anda setelah Anda masuk, memberikan solusi signon tunggal untuk mengakses semua remote Anda. mesin. Panduan ini akan memandu Anda mengaturnya.

Saya belum memverifikasi ini benar-benar berfungsi.


0

Tambahkan ini ke ~/.bashrcfile Anda :

ssh-add -L|grep identities > /dev/null && ssh-add /path/to/ssh/private/key

Saya tidak melihat bagaimana ini berhubungan dengan pertanyaan, yaitu tentang tidak diminta kata sandi pada login berikutnya.
Chris Down

0

Untuk menambahkan kunci (mungkin tanpa kata sandi) dan memastikan bahwa ssh-addtidak akan meminta kata sandi, apa pun yang terjadi, bahkan ketika berjalan di bawah X :

DISPLAY= ssh-add -k /path/to/key </dev/null &>/dev/null

Status keluar menunjukkan keberhasilan atau kegagalan.


0

Jika Anda menjalankan kuda laut sebagai pengelola kata sandi ... Mungkin Anda ini; D

Solusi lain yang mencapai tujuan yang Anda cari hanyalah menambahkan kunci ssh ke kuda laut untuk membuka kunci otomatis saat masuk. Manfaat utama dari hal ini adalah Anda tidak perlu memasukkan kata sandi untuk kunci setelah Anda masuk melalui gdm, atau apa pun yang Anda lakukan dengan masuk meskipun kunci tersebut memiliki kata sandi. Ini MEMBUTUHKAN kunci pribadi dan kunci publik. Mereka juga HARUS mengikuti konvensi penamaan untuk kuda laut. Defaultnya dapat diterima (id_rsa untuk kunci pribadi dan id_rsa.pub untuk kunci publik ... Benar-benar segala sesuatu yang privatekeyname dan privatekeyname.pub )

Untuk menambahkan Anda kunci ssh ke kuda laut untuk membuka kunci otomatis saat masuk; (pada fedora25, saya tidak yakin di mana jalannya di distro lain meskipun kemungkinan besar sangat mirip)

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

Bagi saya, itu

/lib64/seahorse/seahorse-ssh-askpass ~/.ssh/id_rsa

(kuda laut akan secara otomatis menganggap bahwa kunci publik dalam kasus saya adalah id_rsa.pub)

Setelah menjalankan perintah, kuda laut akan membuka bidang kata sandi gtk kecil yang lucu untuk memasukkan kata sandi ke kunci pribadi. atau biarkan kosong jika Anda membuat kunci tanpa kata sandi.

Kuda laut tidak akan meminta Anda jika semuanya berjalan baik. Anda perlu mencoba ssh ke mesin target. Kemudian kuda laut akan meminta Anda untuk membuka kunci dengan kata sandi grafis (INI AKAN HANYA TERJADI SEKALI) tetapi akan terlihat sedikit berbeda kali ini; P (ini juga merupakan bagian di mana kuda laut melakukan beberapa kuda laut untuk ssh-tambahkan sihir. Saya percaya ), dan menawarkan OPSI untuk membuka kunci saat masuk, Anda harus memeriksa opsi ini untuk mencapai tujuan Anda.

Hanya karena saya tidak membaca semua jawaban, saya akan merekomendasikan untuk membatalkan apa yang semua orang katakan agar Anda lakukan dengan ssh-add sebelum mencoba jawaban ini. Melakukan hal yang sebaliknya dapat mengakibatkan sesuatu yang buruk terjadi pada kunci Anda, idk.


0

Ini skrip definitif.

Perbarui $ PASSW, lalu salin dan tempel di Terminal Anda

# <sshpass> via typinator
# Updated: 2017-01-18_21h36
#
# apt-get update -y; apt-get install expect -qy

# Pass this value to ssh-add
PASSW="myfancypass123"

# Define a name for this script
THIS_SCRIPT="$(date +%Y-%m-%d_%H-%M-%S-%N)".sh

# Create a fresh directory to work from / Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la


# Output our bash script file - BEGIN
cat <<< '
#!/bin/bash

set -u     # Stop if an unbound variable is referenced
set -e     # Stop on first error
export HISTIGNORE="expect*";

# Normal CMDs
echo && echo "The process should take about 10 seconds:" && echo
eval "$(ssh-agent -s)"; sleep 0.5;

# Define VAR passed when this bash-script was launched
password="$@"

# Launch the expect magic
expect -c "
    spawn ssh-add /root/.ssh/id_rsa
    expect "?assword:"
    send \"$password\r\"
    expect "?password:"
    send \"$password\r\"
    expect eof"

export HISTIGNORE="";
export password="";
' > $THIS_SCRIPT
# Output our bash script file - END


# Ensure we are in the right path
cd ~/temp; ls -la; sleep 1;

# Run the bash script
chmod +x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$PASSW"; unset password;

# Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la

0

Cara terbaik yang saya ketahui adalah menggunakan skrip login PAM yang saya adaptasi dari pekerjaan sebelumnya karena saya tidak dapat menemukan jawaban yang memuaskan dalam pertanyaan ini.

Frasa sandi Anda disimpan terenkripsi dengan kata sandi sistem Anda dan fungsi derivasi berat. Saat masuk, kata sandi sistem Anda digunakan untuk mendekripsi frasa sandi Anda dan menambahkannya ke agen.

https://github.com/capocasa/systemd-user-pam-ssh

Keuntungan dari setiap solusi lain yang disajikan adalah menggabungkan keamanan yang setara dengan menjalankan ssh-add secara manual saat boot dengan upaya nol. Ini tidak memerlukan alat tambahan dan memiliki satu ketergantungan ekstra yang sudah diinstal secara default pada sebagian besar sistem (OpenSSL).


0

Setup saya di macOS adalah sebagai berikut (di .zshrc, atau .bash_profileuntuk bash people):

# Kill then Load the ssh-agent and set the necessary env variables it outputs
sshRestart() {
    # if all else fails
    # pkill -u $(whoami) ssh-agent;

    if [ -n "$SSH_AUTH_SOCK" ] ; then
        eval `/usr/bin/ssh-agent -k`
    fi
    eval `ssh-agent -s`
    ssh-add ~/.ssh/YOUR_KEY_FILE
    echo "Restarted SSH agent"
}

if [ -z "$SSH_AUTH_SOCK" ] || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]] ; then
    eval `ssh-agent -s` > /dev/null 2>&1
    ssh-add ~/.ssh/YOUR_KEY_FILE > /dev/null 2>&1
fi

Bagian || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]ini diperlukan pada macOS karena nilai defaultnya adalah /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners. Kalau tidak, @Thomas Nyman jawaban komprehensif gagal karena $SSH_AUTH_SOCKselalu diatur ke sesuatu.

Kemudian di .zlogout(atau .bash_logoutuntuk bash people):

if [ -n "$SSH_AUTH_SOCK" ] ; then
    eval `/usr/bin/ssh-agent -k`
fi

Diuji pada macOS Mojave 10.14.5

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.