เริ่ม ssh-agent เมื่อเข้าสู่ระบบ


262

ฉันมีเว็บไซต์เป็น repo Git ระยะไกลดึงจาก Bitbucket.com โดยใช้นามแฝง SSH ฉันสามารถเริ่ม ssh-agent ด้วยตนเองบนเซิร์ฟเวอร์ของฉัน แต่ฉันต้องทำสิ่งนี้ทุกครั้งที่ฉันเข้าสู่ระบบผ่าน SSH

ฉันเริ่มต้น ssh-agent ด้วยตนเอง:

eval ssh-agent $SHELL

จากนั้นฉันเพิ่มตัวแทน:

ssh-add ~/.ssh/bitbucket_id

จากนั้นจะปรากฏขึ้นเมื่อฉัน:

ssh-add -l

และฉันก็สบายดี มีวิธีใดที่จะทำให้กระบวนการนี้เป็นแบบอัตโนมัติดังนั้นฉันจึงไม่ต้องทำทุกครั้งที่ลงชื่อเข้าใช้? เซิร์ฟเวอร์กำลังเรียกใช้ RedHat 6.2 (Santiago)


2
ทุกสิ่งที่คุณต้องการทำทุกครั้งที่คุณเข้าสู่ระบบควรเป็น. profile (การล็อกอินเทอร์มินัล) หรือ. xinitrc (สำหรับการเข้าสู่ระบบ GUI)
Barmar

1
อา! ฉันใช้. bash_profile ... อะไรคือความแตกต่างระหว่าง. profile และ. bash_profile
Pathsofdesign

1
ไม่แน่ใจว่าทำไมคุณจึงใช้คำสั่งแบบนั้นตั้งแต่แรก ssh-agent <command>ทำงาน<command>เป็น subprocess ของssh-agentดังนั้นคุณเริ่มเปลือกใหม่ eval ssh-agentฉันคิดว่าคุณต้องการ
Barmar

9
.bash_profileเฉพาะกับ bash, .profileเป็นทั่วไปของเชลล์ POSIX ทั้งหมด bashจะมีลักษณะเป็นครั้งแรกสำหรับแล้วที่จะเริ่มต้น.bash_profile .profile
Barmar

5
วิธีที่ถูกต้องที่จะวางไข่ssh-agentเป็น "มาตรฐาน" (POSIX ได้) eval $(ssh-agent -s)เปลือก โปรดทราบว่าคุณต้องแน่ใจว่าคุณกำจัดเอเจนต์อย่างถูกต้องเมื่อคุณออกจากระบบดังนั้นจึงแนะนำให้ใส่trap 'kill $SSH_AGENT_PID' EXITใน.profileบรรทัดหลังที่เริ่มเอเจนต์
kostix

คำตอบ:


368

โปรดอ่านบทความนี้ คุณอาจพบว่ามีประโยชน์มาก:

http://mah.everybody.org/docs/ssh

ในกรณีที่ลิงก์ด้านบนหายไปบางวันฉันได้รวบรวมส่วนหลักของการแก้ปัญหาด้านล่าง:

วิธีการแก้ปัญหาจาก Joseph M. Reagle โดย Daniel Starin:

เพิ่มสิ่งต่อไปนี้ในของคุณ .bash_profile

SSH_ENV="$HOME/.ssh/agent-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

รุ่นนี้ดีเป็นพิเศษเพราะมันจะดูว่าคุณได้เริ่มใช้ ssh-agent แล้วและหากไม่พบมันจะเริ่มต้นขึ้นและจัดเก็บการตั้งค่าเพื่อให้พวกเขาสามารถใช้งานได้ในครั้งต่อไปที่คุณเริ่ม เปลือก.


8
ไม่จำเป็นต้องรีสตาร์ทเครื่อง คุณสามารถโหลดซ้ำได้.bash_profileโดยใช้source ~/.bash_profileในเซสชันเชลล์ปัจจุบันของคุณ การรีสตาร์ทเครื่องจะทำงานได้เพราะจะโหลดการกำหนดค่าใหม่อยู่ดี
Litmus

11
ใช้SSH_ENV="$HOME/.ssh/env"(เช่นไม่ใช่ / สิ่งแวดล้อม) ทำไม? sshd ใช้ ~ / .ssh / environment (ดู man page: PermitUserEnvironment) Github ยังแนะนำสิ่งนี้ในวิธีแก้ปัญหาของพวกเขา - help.github.com/articles/…
Andrew Murphy

7
สคริปต์นี้ทำงานสำหรับฉันเมื่อฉันวางไว้ในไฟล์ ~ / .bashrc ของฉัน (ไม่ใช่ ~ / .profile หรือ ~ / .bash_profile) ครั้งแรกที่ฉันเปิดโลคัลคอนโซลจะพร้อมท์สำหรับวลีรหัสผ่านทุกอย่างทำงานได้จากจุดนั้นโดยไม่ต้องแจ้งให้ทราบเพิ่มเติม ไชโย
andrew pate

3
การเพิ่มssh-agentคำสั่ง start ใน. bashrc จะทำให้scpคำสั่งไม่ทำงาน
Dzanvu

5
ยังคงน่ารำคาญ ... คุณต้องทำสิ่งนี้ทุกครั้งที่ลงชื่อเข้าใช้ ... แม้ว่าคุณจะไม่ได้ใช้ ssh จำเป็นต้องทำให้ไฟนี้ดับลงทุกครั้งที่มีการเรียก ssh ... และในอุดมคติคุณควรจะสามารถกำหนดค่าที่โฮสต์ทำให้เกิดคีย์ที่จะโหลด
Erik Aronesty

98

บน Arch Linux สิ่งต่อไปนี้ใช้ได้ผลดีมาก (ควรทำงานกับ distros ที่ยึดตาม systemd ทั้งหมด):

สร้างบริการผู้ใช้ systemd โดยใส่ต่อไปนี้เพื่อ~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

ติดตั้งเชลล์เพื่อให้มีตัวแปรสภาพแวดล้อมสำหรับซ็อกเก็ต ( .bash_profile, .zshrc, ...):

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

เปิดใช้งานบริการดังนั้นมันจะเริ่มโดยอัตโนมัติเมื่อเข้าสู่ระบบและเริ่ม:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

เพิ่มการตั้งค่าการกำหนดค่าต่อไปนี้ลงในไฟล์การตั้งค่า ssh ของคุณ~/.ssh/config(ใช้งานได้ตั้งแต่ SSH 7.2):

AddKeysToAgent  yes

สิ่งนี้จะแนะนำให้ไคลเอ็นต์ ssh เพิ่มคีย์ไปยังเอเจนต์ที่กำลังทำงานอยู่เสมอดังนั้นจึงไม่จำเป็นต้องเพิ่ม ssh ไว้ล่วงหน้า


3
ฉันพบความคิดเห็นนี้ในขณะที่พยายามทำสิ่งนี้ใน Ubuntu ดูเหมือนว่าจะเล่นได้ดีกว่าในระบบมากกว่าการแฮ็คบางอย่างลงในสคริปต์เริ่มต้นอย่างน้อยก็ให้ความรู้เกี่ยวกับวิธีการทำงานของระบบ
xiterion

ฉันลองสิ่งนี้บน Ubuntu 16.04 LTS น่าเสียดายที่กระบวนการเชลล์ทุกกระบวนการต้องการssh-agentกระบวนการแยกต่างหาก บางทีฉันอาจขาดความรู้แม้หลังจากอ่านเอกสารแล้ว
ไดสุเกะอารามากิ

คุณยังสามารถใช้Type = simpleได้ wiki.archlinux.org/index.php/…
Hans-J Schmid

2
ดังนั้นวิธีนี้เป็นพื้นติดตั้ง / กำหนดค่าบริการ systemd (แต่สำหรับผู้ใช้เท่านั้น)?
เทรเวอร์บอยด์สมิ ธ

สิ่งนี้จะไม่ตั้งค่าSSH_AGENT_PIDตัวแปรสภาวะแวดล้อมแม้ว่า :(
MrMeszaros

73

คำถามเก่า แต่ฉันเจอสถานการณ์แบบเดียวกัน อย่าคิดว่าคำตอบข้างต้นบรรลุสิ่งที่ต้องการอย่างเต็มที่ ชิ้นส่วนที่ขาดหายไปคือkeychain; ติดตั้งหากยังไม่ได้ติดตั้ง

sudo apt-get install keychain

จากนั้นเพิ่มบรรทัดต่อไปนี้ใน ~/.bashrc

eval $(keychain --eval id_rsa)

สิ่งนี้จะเริ่มต้นssh-agentถ้ามันไม่ทำงานเชื่อมต่อถ้ามันเป็นโหลดssh-agentตัวแปรสภาพแวดล้อมลงในเชลล์ของคุณและโหลดคีย์ ssh ของคุณ

เปลี่ยนid_rsaเป็นคีย์ส่วนตัวใด ๆ ที่~/.sshคุณต้องการโหลด

การอ้างอิง

/unix/90853/how-can-i-run-ssh-add-automatically-without-password-prompt


พวงกุญแจไม่ทำงานสำหรับฉันตามคำแนะนำที่ได้รับ ฉันเพิ่มใน. bash_profile และ ssh ยังคงถามรหัสผ่านทุกครั้ง ฉันลองหลายครั้งในเชลล์เดียวกัน ไม่มีลูกเต๋า กลับไปที่วิธีการใช้เอสเอสเอสขั้นพื้นฐาน
javadba

เพิ่ม eval keychain --eval id_[yourid file]ใน. bashrc
xelber

4
ฉันใช้เวลา 20 นาทีค้นคว้าวิธีแก้ปัญหาเนื่องจากการจัดรูปแบบความคิดเห็นของ StackOverflow ต่อความคิดเห็น xelber เหนือวิธีการแก้ปัญหาที่ถูกต้องคือeval `keychain --eval id_[yourid file]`การ.bashrcการBackticks จำเป็นต้องประเมินตัวแปรสภาพแวดล้อมไปยังเชลล์ปัจจุบันสำหรับการเข้าถึง ssh-agent ที่กำลังทำงานอยู่
James

2
นี่คือทางออกที่ถูกต้องและเรียบง่าย หากคุณไม่ต้องการเห็นบันทึกเมื่อเรียกใช้งานคำสั่ง Keychain คุณสามารถเพิ่ม-qตัวเลือกสำหรับโหมดเงียบ ข้อมูลเพิ่มเติมเกี่ยวกับ Keychain: funtoo.org/Keychain
Diki Ananta

4
ขอบคุณนี่คือทางออกที่งดงามที่สุด
greenspand

37

โซลูชันที่ยอมรับมีข้อเสียดังต่อไปนี้:

  • มันซับซ้อนในการบำรุงรักษา
  • มันประเมินไฟล์หน่วยเก็บข้อมูลซึ่งอาจนำไปสู่ข้อผิดพลาดหรือการละเมิดความปลอดภัย
  • มันเริ่มต้นเอเจนต์ แต่ไม่หยุดมันซึ่งใกล้เคียงกับการปล่อยกุญแจไว้ในการจุดระเบิด

หากคีย์ของคุณไม่จำเป็นต้องพิมพ์รหัสผ่านฉันขอแนะนำวิธีแก้ไขปัญหาต่อไปนี้ เพิ่มรายการต่อไปนี้ใน.bash_profile ตอนท้าย (แก้ไขรายการคีย์ตามความต้องการของคุณ):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

มันมีข้อดีดังต่อไปนี้:

  • วิธีที่ง่ายกว่ามาก
  • เซสชันตัวแทนสิ้นสุดลงเมื่อเซสชันทุบตีสิ้นสุดลง

มันมีข้อเสียที่เป็นไปได้:

  • เชิงโต้ตอบ ssh-addคำสั่งจะมีผลต่อเซสชันเดียวเท่านั้นซึ่งในความเป็นจริงแล้วปัญหาจะเกิดขึ้นในสถานการณ์ที่ผิดปกติมากเท่านั้น
  • ใช้ไม่ได้หากจำเป็นต้องพิมพ์รหัสผ่าน
  • shell ที่เริ่มทำงานนั้นไม่ใช่การเข้าสู่ระบบ (ซึ่งไม่มีผลอะไรกับ AFAIK)

โปรดทราบว่าssh-agentกระบวนการหลายอย่างไม่ได้เป็นข้อเสียเพราะจะไม่ใช้หน่วยความจำหรือเวลา CPU มากขึ้น


ฉันมีคีย์ SSH ในไดเรกทอรีนอก $ HOME ใน Windows 10 โดยใช้ Git Bash การเปลี่ยนเส้นทางไปยัง RSA คือทั้งหมดที่ฉันต้องทำเพื่อให้ได้ผล TYVM!
kayleeFrye_onDeck

7
ฉันจะยืนยันว่า"หากกุญแจของคุณไม่จำเป็นต้องพิมพ์รหัสผ่าน"ใกล้เคียงกับการปล่อยกุญแจไว้ในการจุดระเบิด
Bruno Bronosky

อย่างน้อยมันก็อยู่ในโฮสต์ของคุณเองไม่ใช่ที่อื่นในเครือข่าย
midenok

1
"ฉันจะเถียงว่า" หากคีย์ของคุณไม่จำเป็นต้องพิมพ์รหัสผ่าน "ใกล้เคียงกับการปล่อยคีย์ไว้ในจุดระเบิด" <- อธิบายได้อย่างไร ?? เนื่องจากกุญแจนั้นมีความยืดหยุ่นมากกว่ารหัสผ่านทำให้เพิกถอนได้ง่ายกว่า (คุณเป็นเพราะใช้กุญแจสำหรับผู้ใช้ sudo ที่เข้าถึงแบบเต็มเท่านั้น? tsk tsk) ปุ่มหลายชุดสำหรับหลายโปรไฟล์ของผู้ใช้ หากคุณต้องการทำสิ่งใดโดยอัตโนมัติ (เช่นการปรับใช้หรือการตรวจสอบจากต้นทางถึงปลายทาง) ขอให้โชคดีในการพิมพ์รหัสผ่านในระหว่าง "orchestration"
Scott Prive

2
อย่าทำอย่างนั้น คีย์รหัสผ่านเป็นวิธีปฏิบัติที่ไม่ดี
user48678

26

เพิ่มลงในของคุณ~/.bashrcจากนั้นออกจากระบบและกลับเข้ามาใหม่เพื่อให้มีผล

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

นี่ควรจะถามรหัสผ่านในครั้งแรกที่คุณเข้าสู่ระบบหลังจากรีบูตแต่ละครั้ง มันจะนำมาใช้ซ้ำssh-agentตราบใดที่มันยังคงทำงานอยู่


สิ่งที่เราจะใช้แทนถ้าเรามีหลายคีย์และพวกเขาก็ไม่ได้ตั้งชื่อ~/.ssh/id_rsa? ดูเหมือนว่าssh-addส่วนหนึ่งของคำตอบของคุณคาดว่าชื่อไฟล์เริ่มต้นสำหรับคีย์
Gabriel Staples

ได้. ผมเชื่อว่าคุณก็สามารถเพิ่มชื่อไฟล์เพื่อไปท้ายสุดของบรรทัดสุดท้ายถ้าจำเป็น
Collin เดอร์สัน

แต่คุณยังคงไม่สามารถทำให้สคริปต์ทำงานโดยอัตโนมัติเช่นการดึงข้อมูลคอมไพล์โดยไม่ต้องป้อนรหัสผ่านด้วยตนเอง? จะหลีกเลี่ยงได้อย่างไร
trainoasis

7

ดังนั้นฉันจึงเคยใช้วิธีการที่อธิบายไว้ข้างต้น แต่ฉันชอบที่ตัวแทนจะตายเมื่อสิ้นสุดทุบตีครั้งสุดท้ายของฉัน มันยาวกว่าโซลูชันอื่นเล็กน้อย แต่เป็นวิธีที่ฉันชอบ แนวคิดพื้นฐานคือเซสชัน bash แรกเริ่มต้น ssh-agent จากนั้นแต่ละเซสชัน bash เพิ่มเติมจะตรวจสอบไฟล์กำหนดค่า ( ~/.ssh/.agent_env) หากมีและมีเซสชันที่ใช้งานอยู่ให้ทำการจัดหาสภาพแวดล้อมและสร้างฮาร์ดลิงก์ไปยังไฟล์ซ็อกเก็ตใน/tmp(ต้องอยู่ในระบบไฟล์เดียวกับไฟล์ซ็อกเก็ตดั้งเดิม) เมื่อเซสชันทุบตีปิดตัวลงจะเป็นการลบฮาร์ดลิงก์ของตัวเอง เซสชั่นสุดท้ายที่จะปิดจะพบว่าฮาร์ดลิงก์มี 2 ลิงค์ (ฮาร์ดลิงค์และดั้งเดิม) การลบซ็อกเก็ตของกระบวนการและการฆ่ากระบวนการจะส่งผลให้ 0 ออกจากสภาพแวดล้อมที่สะอาดหลังจากเซสชั่นทุบตีสุดท้ายปิด

# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # if no agents or environment file is missing create a new one
    # remove old agents / environment variable files
    kill $agent running
    rm ~/.ssh/.agent_env 

    # restart
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# create our own hardlink to the socket (with random name)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x              

ถ้าเราเรียกใช้สิ่งนี้เป็นสคริปต์ BASH ในการเข้าสู่ระบบของเปลือกอื่น ๆ (อื่น ๆ แล้ว BASH) มันควรจะทำงานเช่นกันใช่ไหม?
hoijui

7

เพียงเพิ่มโซลูชันอื่น: P ฉันไปพร้อมกับโซลูชันของ @spheenik และ @ collin-anderson

 # Ensure that we have an ssh config with AddKeysToAgent set to true
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Ensure a ssh-agent is running so you only have to enter keys once
 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

อาจจะดูหรูหราไปหน่อย แต่ก็เรียบง่ายและอ่านง่าย วิธีนี้:

  • ทำให้แน่ใจว่าAddKeysToAgent yesอยู่ในการกำหนดค่า ssh ของคุณดังนั้นคีย์จะถูกเพิ่มโดยอัตโนมัติเมื่อมีการใช้งาน
  • ไม่แจ้งให้คุณป้อนข้อความรหัสผ่านใด ๆ ที่เข้าสู่ระบบ (อีกครั้งการป้อนข้อความรหัสผ่านแบบครั้งเดียวเกิดขึ้นเมื่อใช้ครั้งแรก)
  • เริ่มต้นเอเจนต์ ssh แบบไม่ปิดเสียงหากยังไม่ได้สตาร์ทเอเจนต์

ยินดีต้อนรับความคิดเห็น :)


1
มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน บน Kubuntu ฉันใส่ไว้ในโปรไฟล์.
Shai

1
ดีใจที่ได้ทราบเกี่ยวกับการAddKeysToAgent yesตั้งค่า ขอบคุณ
Collin Anderson

3

ฉันจะแก้ไขได้โดยการเพิ่มนี้ไป/ etc / รายละเอียด - ระบบกว้าง (หรือให้กับผู้ใช้ในท้องถิ่น.profileหรือ _.bash_profile_):

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`who am i |awk '{print $1}'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
    echo $SERVICE running.
else
    echo $SERVICE not running.
    echo starting
    ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

สิ่งนี้เริ่มต้น ssh-agent ใหม่หากไม่ได้รันสำหรับผู้ใช้ปัจจุบันหรือตั้งค่าพารามิเตอร์ ssh-agent env อีกครั้งหากกำลังทำงาน


ขอขอบคุณที่พูดว่าจะบอกได้อย่างไรว่าตัวแทนทำงานอยู่แล้ว!
Mike Maxwell

วิธีการที่ไม่if pgrep -u $WHOAMI $SERVICE >/dev/nullทำงานหรือไม่
Josh Desmond

3

ผู้ใช้งานของเชลล์ปลาสามารถใช้สคริปต์นี้เพื่อทำสิ่งเดียวกัน

# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment

function start_agent                                                                                                                                                                    
    echo "Initializing new SSH agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "succeeded"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities                                                                                                                                                                
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end

2

ฉันใช้เครื่องมือssh-identสำหรับสิ่งนี้

จากman- page:

ssh-ident - เริ่มต้นและใช้ ssh-agent และตัวตนของการโหลดตามความจำเป็น


1

วิธีแก้ปัญหาคู่พยายามจากหลายแหล่ง แต่ดูเหมือนว่าปัญหามากเกินไป ในที่สุดฉันก็พบสิ่งที่ง่ายที่สุด :)

หากคุณยังไม่คุ้นเคยกับzshและoh-my-zsh ให้ติดตั้ง คุณจะรักมัน :)

จากนั้นแก้ไข .zshrc

vim ~/.zshrc

ค้นหาpluginsส่วนและอัปเดตเพื่อใช้ssh-agentเช่น:

plugins=(ssh-agent git)

และนั่นคือทั้งหมด! คุณจะมีssh-agentและทำงานทุกครั้งที่คุณเริ่มเชลล์


1

ฉันชอบคำตอบของคุณมาก มันทำให้การทำงานจากcygwin / linuxโฮสต์ง่ายขึ้นมาก ฉันรวมฟังก์ชั่นเริ่มต้นและสิ้นสุดเพื่อให้ปลอดภัย

SSH_ENV="$HOME/.ssh/.agent_env"

function start_agent {
    echo "Initialising new SSH agent..."

    eval `/usr/bin/ssh-agent`
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${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

# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK

end_agent()
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
    if [[ "$nhard" -eq 2 ]]; then
        rm ${SSH_ENV}
        /usr/bin/ssh-agent -k
    fi
    rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.