ใช้งาน SSH Agent เมื่อเริ่มต้น Git Bash บน Windows


152

ฉันใช้ทุบตีคอมไพล์ ฉันต้องใช้

eval `ssh-agent.exe`
ssh-add /my/ssh/location/

ทุกครั้งที่ฉันเริ่มทุบตี Git ใหม่

มีวิธีการตั้งค่า ssh ตัวแทนอย่างถาวรหรือไม่? หรือ windows มีวิธีที่ดีในการจัดการปุ่ม ssh หรือไม่?

ฉันเป็นคนใหม่โปรดให้รายละเอียดการสอนขอบคุณ!


3
เป็น/my/ssh/location/equalivent เพื่อสิ่งที่ต้องการ/c/Users/Foobar/.ssh/?
Nick

มีการโพสต์ปัญหาที่คล้ายกันที่superuser.com/q/1238486/478378ซึ่งได้รับการแก้ไขแล้ว สรุปสาระสำคัญดังต่อไปนี้มีทุกรายละเอียดgist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d ขอบคุณ
Jignesh Gohel

คำตอบ:


138

ในเซสชั่นคอมไพล์ทุบตีคุณสามารถเพิ่มสคริปต์เพื่อ~/.profileหรือ~/.bashrc( มี~มักจะถูกตั้งค่าให้%USERPROFILE% ) ssh-agentเพื่อให้เซสชั่นกล่าวว่าการเปิดตัวโดยอัตโนมัติ หากไฟล์ไม่มีอยู่เพียงแค่สร้างมันขึ้นมา

นี่คือสิ่งที่ GitHub อธิบายไว้ใน " การทำงานกับข้อความรหัสผ่านคีย์ SSH "

ส่วน " การเรียกใช้งาน ssh-agent โดยอัตโนมัติใน Git สำหรับ Windows " ของบทความนั้นมีสคริปต์ที่สมบูรณ์ซึ่งจะตรวจสอบว่าเอเจนต์ทำงานอยู่หรือไม่ ด้านล่างเป็นเพียงตัวอย่างดูบทความ GitHub สำหรับการแก้ปัญหาแบบเต็ม

# This is just a snippet. See the article above.
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

แหล่งข้อมูลอื่น ๆ :

" การเรียกใช้ ssh-agent เพื่อทำงานกับ git ที่รันจากเชลล์คำสั่ง windows " มีสคริปต์ที่คล้ายกัน แต่ฉันจะอ้างถึงบทความ GitHub ข้างต้นเป็นหลักซึ่งมีความแข็งแกร่งและทันสมัย


สิ่งหนึ่งที่น่ารำคาญเล็กน้อยที่ฉันมีคือถ้าฉันรู้ว่าฉันจะไม่ใช้ git ฉันจะไม่ใส่รหัสผ่านของคีย์ ssh จากนั้นทุกเชลล์ที่ฉันเปิดจะขออีกครั้ง นี่คือสถานะ 1, เอเจนต์ที่รันคีย์ w / o ดังนั้นคุณสามารถลบ ssh-add ออกจากส่วนนี้หากคุณไม่ป้อนข้อความรหัสผ่านครั้งแรกรอบ ๆ คุณจะไม่ถูกถามอีกจนกว่าคุณจะเรียกใช้ ssh-add ด้วยตนเอง
Andy2K11

@Gordon ส่วนใดของhelp.github.com/articles/working-with-ssh-key-passphrasesลิงก์ GitHub นั้นมีการเปลี่ยนแปลงอย่างไร เนื้อหายังคงอยู่ที่นั่นและดูเหมือนว่าจะเกี่ยวข้องกับคำตอบนี้
VonC

1
@ Andy2K11 หากคุณต้องการป้อนข้อความรหัสผ่านในครั้งแรกที่คุณต้องการไม่ใช่เมื่อเปิดเชลล์วิธีที่ดีที่สุดสำหรับฉันคือการลบ ssh-add ออกจาก. bash_profile ตามที่คุณพูดถึงและเพิ่ม "AddKeysToAgent ใช่" เพื่อ ไฟล์. ssh / config ของคุณ (ดูคำตอบนี้: superuser.com/a/1114257/523133 ) วิธีนี้คุณไม่จำเป็นต้องจำการเรียกใช้ ssh-add
hardsetting

30

PS: คำแนะนำเหล่านี้อยู่ในบริบทของ Bash shell ที่เปิดในระบบย่อย Linux ของ Windows 10 และไม่ได้พูดถึงการเชื่อมโยง sym คีย์ SSH ที่สร้างใน Windows ด้วย Bash บน Ubuntu บน Windows

1) อัปเดต. bashrcของคุณโดยเพิ่มสิ่งต่อไปนี้

# Set up ssh-agent
SSH_ENV="$HOME/.ssh/environment"

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

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    kill -0 $SSH_AGENT_PID 2>/dev/null || {
        start_agent
    }
else
    start_agent
fi

2) จากนั้นเรียกใช้$ source ~/.bashrcเพื่อโหลดการกำหนดค่าของคุณใหม่

ขั้นตอนข้างต้นมาจากhttps://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) สร้างไฟล์ปรับแต่ง SSH ถ้าไม่มี ใช้คำสั่งต่อไปนี้เพื่อสร้างใหม่:.ssh$ touch config

4) เพิ่มการติดตาม ~/.ssh/config

Host github.com-<YOUR_GITHUB_USERNAME> 
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes


Host csexperimental.abc.com
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes

<More hosts and github configs can be added in similar manner mentioned above>

5) เพิ่มกุญแจของคุณไปยังตัวแทน SSH โดยใช้คำสั่ง$ ssh-add ~/.ssh/id_work_gmailจากนั้นคุณควรจะสามารถเชื่อมต่อกับบัญชี Github หรือโฮสต์ระยะไกลโดยใช้ ssh ตัวอย่างเช่นในบริบทของตัวอย่างโค้ดด้านบน:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

หรือ

$ ssh <USER>@csexperimental.abc.com

การเพิ่มคีย์ไปยังเอเจนต์ SSH นี้จำเป็นต้องดำเนินการเพียงครั้งเดียวเท่านั้น

6) ตอนนี้ออกจากระบบเซสชัน Bash ของคุณบน Windows Linux Subsystem เช่นออกจากคอนโซล Bash ทั้งหมดอีกครั้งและเริ่มคอนโซลใหม่อีกครั้งและลอง SSH ไปยัง Github Host หรือโฮสต์อื่น ๆ ของคุณตามที่กำหนดไว้ในไฟล์ SSH config ขั้นตอน

บันทึก:

  • หากคุณประสบจากนั้นปรับปรุงสิทธิ์ใช้คำสั่งBad owner or permissions on ~/.ssh/config chmod 600 ~/.ssh/configการอ้างอิง: https://serverfault.com/a/253314/98910

  • สำหรับขั้นตอนดังกล่าวข้างต้นในการทำงานคุณจะต้องOpenSSH V 7.2 และใหม่กว่า หากคุณมีรุ่นเก่ากว่าคุณสามารถอัปเกรดได้โดยใช้ขั้นตอนที่กล่าวไว้ที่https://stackoverflow.com/a/41555393/936494

  • รายละเอียดเดียวกันสามารถพบได้ในประเด็นสำคัญตัวแทน SSH ระบบย่อย Windows 10 Linux

ขอบคุณ


1
ทางเลือกที่น่าสนใจโดยใช้ WSL +1
VonC

@JigneshGohel ขอบคุณสคริปต์นี้สมบูรณ์แบบและ v. สะอาด! ผมไม่ได้เป็นเพียงแค่สงสัยว่าทำไมคุณมี>> "${SSH_ENV}"? มันไม่ควรจะเป็นเพียงแค่> "${SSH_ENV}"? แน่นอนว่างานของคุณ แต่มันจบลงด้วยไฟล์ที่ช้าและยาวขึ้นเรื่อย ๆ~/.ssh/environmentสำหรับ (อย่างที่ฉันคิด!) ไม่มีเหตุผล ... ขอบคุณมาก แต่ขอบคุณมาก! ฉันรู้สึกว่าสคริปต์นี้ควรรวมอยู่ในค่าเริ่มต้น.bashrcสำหรับ WSL Ubuntu มันมีประโยชน์มาก!
MikeBeaton

5

ฉันพบวิธีที่ราบรื่นที่สุดในการบรรลุเป้าหมายนี้คือการใช้ Pageant เป็นเอเจนต์ SSH และ plink

คุณต้องมีการกำหนดค่า putty session สำหรับชื่อโฮสต์ที่ใช้ในรีโมตของคุณ

คุณจะต้องมี plink.exe ซึ่งสามารถดาวน์โหลดได้จากเว็บไซต์เดียวกันกับผงสำหรับอุดรู

และคุณต้องมีการเรียกใช้ Pageant พร้อมโหลดกุญแจของคุณ ฉันมีทางลัดไปประกวดในโฟลเดอร์เริ่มต้นของฉันที่โหลดคีย์ SSH ของฉันเมื่อฉันเข้าสู่ระบบ

เมื่อคุณติดตั้ง git-scm คุณสามารถระบุให้ใช้เต่า / plink แทน OpenSSH

ผลสุทธิคือคุณสามารถเปิด git-bash เมื่อใดก็ตามที่คุณต้องการและกด / ดึงโดยไม่ถูกท้าทายสำหรับวลีรหัสผ่าน

ใช้กับเซสชัน putty และ WinSCP เมื่อ pageant มีการโหลดคีย์ของคุณ มันทำให้ชีวิตง่ายขึ้นมาก (และปลอดภัย)


2

ขณะที่ผมไม่ชอบใช้ฉาบใน Windows เป็นวิธีแก้ปัญหาผมสร้างที่ง่ายมากยูทิลิตี้ตัวแทน ssh-เสื้อคลุม มันสแกนโฟลเดอร์. ssh ของคุณและเพิ่มกุญแจทั้งหมดของคุณไปยังตัวแทน คุณเพียงแค่ใส่มันลงในโฟลเดอร์เริ่มต้นของ Windows เพื่อให้มันทำงาน

สมมติฐาน :

  • ssh-agent ในพา ธ
  • shh-add in path (ทั้งคู่โดยเลือกตัวเลือก "RED" เมื่อติดตั้ง git
  • กุญแจส่วนตัวอยู่ในโฟลเดอร์% USERPROFILE% /. ssh
  • ชื่อกุญแจส่วนตัวเริ่มต้นด้วย id (เช่น id_rsa)

ดี! +1 ฉันมักจะทำงานกับ openssh (ไม่ใช่สีโป๊ว) ดังนั้นมันจึงเป็นทางออกที่น่าสนใจสำหรับคีย์ส่วนตัวที่มีข้อความรหัสผ่าน
VonC

ในขณะที่คุณอยู่ใน GitHub แล้วทำไมไม่เพียงแค่สร้างที่เก็บ Git?
Thorbjørn Ravn Andersen

เพียงลบ the / release จากพา ธ ;-)
Erez A. Korn

1

ฉันไม่สามารถทำให้มันทำงานได้ตามคำตอบที่ดีที่สุดอาจเป็นเพราะฉันเป็นคนหูหนวก PC และขาดอะไรที่ชัดเจน แต่เพียงแค่ FYI ในกรณีที่มันช่วยให้ใครบางคนที่ถูกท้าทายเหมือนฉันสิ่งที่ทำงานได้ดีที่สุดคือผ่านลิงก์ใดลิงก์หนึ่งที่นี่ (อ้างอิงในคำตอบ) สิ่งนี้เกี่ยวข้องกับการวางสิ่งต่อไปนี้ในของฉัน.bash_profile:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

ฉันอาจมีบางสิ่งที่กำหนดค่าแปลก แต่ไม่ประสบความสำเร็จเมื่อฉันเพิ่มลงในของฉัน.profileหรือ.bashrcหรือความท้าทายที่แท้จริงอื่น ๆ ที่ฉันพบคือฉันไม่ใช่ผู้ดูแลระบบบนคอมพิวเตอร์เครื่องนี้และไม่สามารถเปลี่ยนตัวแปรสภาพแวดล้อมโดยไม่ได้รับการอนุมัติจากฝ่ายไอทีดังนั้นนี่จึงเป็นทางออกสำหรับผู้ที่ไม่สามารถเข้าถึงได้

คุณจะรู้ว่ามันทำงานถ้าคุณได้รับพร้อมท์สำหรับรหัสผ่าน ssh ของคุณเมื่อคุณเปิด git bash ในที่สุดฮาเลลูยาก็ทำงานได้


1

วางสิ่งนี้ไว้ใน ~ / .bashrc ของคุณ (หรือไฟล์ที่มาจากไฟล์นั้น) ซึ่งจะหยุดการเรียกใช้หลายครั้งโดยไม่จำเป็นต่อเชลล์:

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

จากนั้นเพิ่ม "AddKeysToAgent ใช่" ใน ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh ไปยังเซิร์ฟเวอร์ของคุณ (หรือ git pull) โดยปกติแล้วคุณจะถูกขอรหัสผ่าน / วลีรหัสผ่านหนึ่งครั้งต่อเซสชัน


0

สร้าง. bashrcใหม่ในไดเรกทอรี ~ ของคุณ

คุณสามารถใส่คำสั่งที่คุณต้องการดำเนินการทุกครั้งที่คุณเริ่มทุบตี


มันต้องทำงาน ลองใส่.bashrcไฟล์ที่ง่าย ๆ(เช่นecho testและตรวจสอบว่ามันโหลดเมื่อคุณเรียกใช้ Git Bash หรือไม่
David Ferenczy Rogožan

โปรดทราบด้วยว่า ~ ใน PowerShell นั้นแตกต่างจาก ~ ใน Git Bash / Cygwin ขึ้นอยู่กับรุ่นที่ติดตั้งและตัวเลือกผู้ใช้ที่ระบุ
dragon788

@Yar บน Windows ใส่ในโฟลเดอร์ผู้ใช้ของคุณเช่น.bashrc C:\Users\john
Martin van Driel

0

วิธีแก้ปัญหาสายสองอย่างง่ายจากคำตอบนี้ :

สำหรับsh , ทุบตี , ฯลฯ :

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

สำหรับcsh , tcshฯลฯ :

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.