ฉันได้โคลนที่เก็บคอมไพล์ของฉันมากกว่า ssh ดังนั้นทุกครั้งที่ฉันสื่อสารกับผู้ให้กำเนิดโดยการกดหรือดึงฉันต้องป้อนรหัสผ่านอีกครั้ง ฉันจะกำหนดค่า git ได้อย่างไรโดยที่ฉันไม่จำเป็นต้องใส่รหัสผ่านหลาย ๆ ครั้ง?
ฉันได้โคลนที่เก็บคอมไพล์ของฉันมากกว่า ssh ดังนั้นทุกครั้งที่ฉันสื่อสารกับผู้ให้กำเนิดโดยการกดหรือดึงฉันต้องป้อนรหัสผ่านอีกครั้ง ฉันจะกำหนดค่า git ได้อย่างไรโดยที่ฉันไม่จำเป็นต้องใส่รหัสผ่านหลาย ๆ ครั้ง?
คำตอบ:
ssh-add
คุณssh-agent
จะต้องเรียกใช้และถือกุญแจส่วนตัวของคุณ(ตกลงตอบสนองต่อคำถามที่ได้รับการปรับปรุงก่อนอื่นคุณssh-keygen
ต้องสร้างกุญแจสาธารณะและกุญแจส่วนตัวตามที่Jefromi อธิบายไว้คุณวางกุญแจสาธารณะไว้บนเซิร์ฟเวอร์คุณควรใช้วลีรหัสผ่านถ้าคุณไม่มีข้อความเทียบเท่า รหัสผ่านข้อความในคีย์ส่วนตัวของคุณ แต่เมื่อคุณทำแล้วคุณต้องเป็นเรื่องจริงssh-agent
ตามที่อธิบายไว้ด้านล่าง)
คุณต้องการที่จะทำงานssh-agent
ในพื้นหลังขณะที่คุณเข้าสู่ระบบเมื่อคุณเข้าสู่ระบบความคิดคือการทำงานssh-add
ครั้งเดียวและครั้งเดียวเพื่อให้ตัวแทนข้อความรหัสผ่านของคุณเพื่อถอดรหัสคีย์ของคุณ ตัวแทนก็จะอยู่ในหน่วยความจำโดยปลดล็อคและโหลดกุญแจของคุณพร้อมใช้ทุกครั้งที่คุณอยู่
คำสั่ง ssh-family ทั้งหมด1จะปรึกษาตัวแทนและสามารถใช้งานไพรเวตคีย์ของคุณได้โดยอัตโนมัติ
ใน OSX (err, macOS ), GNOME และระบบ KDE ssh-agent
มักจะเปิดตัวโดยอัตโนมัติสำหรับคุณ ฉันจะไปดูรายละเอียดในกรณีเช่นฉันคุณมี Cygwin หรือสภาพแวดล้อมหน้าต่างอื่น ๆ ที่แน่นอนที่สุดนี้ไม่ได้ทำเพื่อคุณ
เริ่มที่นี่: man ssh-agent
.
มีหลายวิธีในการเรียกใช้ตัวแทนโดยอัตโนมัติ ดังที่หน้า man อธิบายคุณสามารถเรียกใช้เพื่อให้เป็นพาเรนต์ของกระบวนการอื่น ๆ ของเซสชันการเข้าสู่ระบบทั้งหมดของคุณ ด้วยวิธีนี้ตัวแปรสภาพแวดล้อมที่มีให้จะอยู่ในเชลล์ของคุณโดยอัตโนมัติ เมื่อคุณ (ต่อมา) เรียกใช้ssh-add
หรือssh
ทั้งสองจะสามารถเข้าถึงตัวแทนเพราะพวกเขาทั้งหมดมีตัวแปรสภาพแวดล้อมที่มีชื่อพา ธ ซ็อกเก็ตมายากลหรืออะไรก็ตาม
หรือคุณสามารถรันเอเจนต์เป็นชายด์ธรรมดาบันทึกการตั้งค่าสภาพแวดล้อมในไฟล์และซอร์สไฟล์นั้นในทุกเชลล์เมื่อเริ่มทำงาน
ระบบ OSX และ Ubuntu ของฉันทำการตั้งค่าการเปิดตัวตัวแทนโดยอัตโนมัติดังนั้นสิ่งที่ฉันต้องทำคือเรียกใช้ssh-add
เพียงครั้งเดียว ลองเรียกใช้ssh-add
และดูว่าใช้งานได้หรือไม่หากเป็นเช่นนั้นคุณจำเป็นต้องทำหนึ่งครั้งต่อการรีบูต
ระบบ Cygwin ของฉันต้องการมันด้วยตนเองดังนั้นฉันจึงทำสิ่งนี้ในของฉัน.profile
และฉันมี.bashrc
แหล่งที่มา.profile
:
. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
ssh-agent > .agent
. .agent > /dev/null
}
.agent
ไฟล์จะถูกสร้างขึ้นโดยอัตโนมัติสคริปต์; มันมีคำจำกัดความตัวแปรสภาพแวดล้อมและการส่งออก ข้างต้นพยายามที่จะแหล่งไฟล์ps(1)
. agent แล้วพยายามตัวแทน หากไม่สามารถใช้งานได้จะเริ่มต้นตัวแทนและสร้างไฟล์ตัวแทนใหม่ นอกจากนี้คุณยังสามารถเรียกใช้ssh-add
และถ้ามันล้มเหลวในการเริ่มต้นตัวแทน
sudo
ด้วยส่วนขยาย pam ที่ถูกต้อง
ssh-agent
มันอาจจะมีผู้ใช้:eval `ssh-agent`
พบปัญหาที่คล้ายกันกับ GitHub เพราะฉันใช้โปรโตคอล HTTPS หากต้องการตรวจสอบว่าคุณใช้โปรโตคอลใดอยู่
git config -l
remote.origin.url
และดูที่บรรทัดที่เริ่มต้นด้วย เพื่อสลับโปรโตคอลของคุณ
git config remote.origin.url git@github.com:your_username/your_project.git
Permission denied
ข้อผิดพลาด
git remote set-url origin git@github.com:your_username/your_project.git
นี่คือการกำหนดค่า ssh ไม่ใช่ git หากคุณยังไม่ได้ทำคุณควรใช้ssh-keygen
(พร้อมข้อความรหัสผ่านเปล่า) เพื่อสร้างคู่กุญแจ ssh-copy-id
จากนั้นคุณสามารถคัดลอกคีย์สาธารณะไปยังปลายทางระยะไกลด้วย ถ้าคุณไม่จำเป็นต้องใช้หลาย ๆ ปุ่ม (เช่นอันที่ปลอดภัยกว่าพร้อมวลีรหัสผ่านเพื่อวัตถุประสงค์อื่น ๆ ) หรือคุณมีสิ่งที่เป็นเอกลักษณ์หลายอย่างที่แปลก ๆ เกิดขึ้นมันง่ายมาก:
ssh-keygen # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host
แก้ไข: คุณควรจริงๆเพียงแค่อ่านคำตอบ DigitalRoss แต่ถ้าคุณใช้คีย์ที่มีวลีรหัสผ่านที่คุณจะต้องใช้ssh-add <key-file>
เพื่อเพิ่มไปยังssh-agent
(และเห็นได้ชัดว่าเริ่มต้นขึ้นssh-agent
ถ้าการกระจายของคุณไม่ได้มีหนึ่งในการทำงานสำหรับคุณ)
ssh-agent
ในขณะที่เขาต้องการหลีกเลี่ยงปัญหาการใส่รหัสผ่านทุกครั้ง ไม่ downvoting แต่ฉันคิดว่าคุณจำเป็นต้องปรับปรุงคำตอบนี้เว้นแต่ว่าฉันเป็นคนที่เข้าใจผิด ...
ssh-agent
อย่างไรก็ตามคุณของหลักสูตรที่เหมาะสมเกี่ยวกับ +1 ถึงคุณ!
ssh-*
เรียกว่า passphrase ที่จำเป็นในการใช้คีย์ - ซึ่งคุณหมายถึงรหัสผ่านจริงของผู้ใช้บนรีโมต?
ตรวจสอบให้แน่ใจว่าเมื่อคุณโคลนที่เก็บคุณทำกับ SSH URL ไม่ใช่ HTTPS ในกล่อง URL โคลนของ repo เลือกโปรโตคอล SSH ก่อนที่จะคัดลอก URL ดูภาพด้านล่าง:
หากคุณโคลนโดยใช้HTTPS (แนะนำ) ดังนั้น: -
git config --global credential.helper cache
แล้ว
git config --global credential.helper 'cache --timeout=2592000'
หมดเวลา = 2592000 (30 วันในไม่กี่วินาที) เพื่อเปิดใช้งานการแคชเป็นเวลา 30 วัน (หรือชุดใดก็ตามที่คุณ)
ตอนนี้รันคำสั่ง git แบบง่ายที่ต้องการชื่อผู้ใช้และรหัสผ่าน
ป้อนข้อมูลรับรองของคุณหนึ่งครั้งและตอนนี้แคชถูกเปิดใช้งานเป็นเวลา 30 วัน
ลองอีกครั้งด้วยคำสั่ง git และตอนนี้คุณไม่จำเป็นต้องมีข้อมูลรับรองใด ๆ
สำหรับข้อมูลเพิ่มเติม: - แคชรหัสผ่าน GitHub ของคุณใน Git
หมายเหตุ : คุณต้องใช้ Git 1.7.10 ขึ้นไปเพื่อใช้ตัวช่วยข้อมูลประจำตัว เมื่อรีสตาร์ทระบบเราอาจต้องป้อนรหัสผ่านอีกครั้ง
ขยายความคิดของ Muein สำหรับผู้ที่ต้องการแก้ไขไฟล์โดยตรงผ่านการรันคำสั่งใน git-bash หรือเทอร์มินัล
ไปที่ไดเรกทอรี. git ของโครงการ (รูทโปรเจ็กต์ในเครื่องของคุณ) แล้วเปิดไฟล์ 'config' จากนั้นค้นหา [remote "origin"] และตั้งค่า url ดังนี้:
[remote "origin"]
#the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
url = git@github.com:<username>/<projectname>.git
ฉันคิดว่ามีสองสิ่งที่แตกต่างกันที่นี่ อันแรกก็คือการรับรองความถูกต้อง SSH ปกติต้องการให้ผู้ใช้ใส่รหัสผ่านของบัญชี (ที่รหัสผ่านบัญชีจะได้รับการรับรองความถูกต้องกับวิธีการที่แตกต่างกันขึ้นอยู่กับการกำหนดค่า sshd)
คุณสามารถหลีกเลี่ยงการใส่รหัสผ่านนั้นโดยใช้ใบรับรอง ด้วยใบรับรองคุณยังต้องใส่รหัสผ่าน แต่คราวนี้เป็นรหัสผ่านของรหัสส่วนตัวของคุณ (ซึ่งไม่ขึ้นอยู่กับรหัสผ่านของบัญชี)
ในการทำเช่นนี้คุณสามารถทำตามคำแนะนำที่ steveth45:
หากคุณต้องการหลีกเลี่ยงการใส่รหัสผ่านใบรับรองทุกครั้งคุณสามารถใช้ ssh-agent ดังที่ DigitalRoss ระบุไว้
วิธีที่แน่นอนที่คุณทำขึ้นอยู่กับ Unix vs Windows แต่โดยพื้นฐานแล้วคุณจำเป็นต้องเรียกใช้ ssh-agent ในพื้นหลังเมื่อคุณเข้าสู่ระบบและจากนั้นเป็นครั้งแรกที่คุณเข้าสู่ระบบเรียกใช้ ssh-add เพื่อให้ตัวแทนข้อความรหัสผ่านของคุณ คำสั่ง ssh-family ทั้งหมดจะปรึกษาตัวแทนและรับข้อความรหัสผ่านของคุณโดยอัตโนมัติ
เริ่มที่นี่: man ssh-agent
ปัญหาเดียวของ ssh-agent ก็คืออย่างน้อยคุณจะต้องใส่รหัสผ่านใบรับรองในทุก ๆ เชลล์ใหม่ จากนั้นใบรับรองจะถูก "โหลด" และคุณสามารถใช้เพื่อตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ ssh โดยไม่ต้องใส่รหัสผ่านใด ๆ แต่มันอยู่บนเปลือกนั้น
ด้วยKeychainคุณสามารถทำสิ่งเดียวกันกับ ssh-agent แต่ "system-wide" เมื่อคุณเปิดคอมพิวเตอร์คุณจะเปิดเปลือกและใส่รหัสผ่านของใบรับรอง จากนั้นเชลล์อื่น ๆ จะใช้ใบรับรอง "ที่โหลด" และรหัสผ่านของคุณจะไม่ถูกถามอีกจนกว่าคุณจะรีสตาร์ทพีซี
Gnome มีแอปพลิเคชันที่คล้ายกันเรียกว่าGnome Keyringซึ่งจะขอรหัสผ่านใบรับรองของคุณในครั้งแรกที่คุณใช้และจากนั้นจะเก็บมันไว้อย่างปลอดภัยดังนั้นคุณจะไม่ถูกถามอีก
AddKeysToAgent yes
ใน. ssh / config โหลดแล้วในหน่วยความจำจนกว่าคุณจะปิดคอมพิวเตอร์
หากคุณใช้ GitHub พวกเขามีการสอนที่ดีมากที่อธิบายได้ชัดเจนยิ่งขึ้น (อย่างน้อยสำหรับฉัน)
ssh-keygen -t rsa
เมื่อถามวลีรหัสผ่านให้เว้นว่างไว้เช่นเพียงกด Enter ง่ายเหมือนที่ !!
ลองสิ่งนี้จากกล่องที่คุณกด
ssh git@github.com
จากนั้นคุณควรได้รับการตอบรับจาก GitHub และจะไม่เป็นไร
Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.
แต่อย่างใดคอมไพล์ยังคงถามรหัสผ่านเมื่อฉันพยายามที่จะผลักดัน
ฉันต้องโคลน repo git จากเซิร์ฟเวอร์ที่ไม่อนุญาตให้เข้าสู่ระบบ vie ssh สำคัญ แต่ด้วยผู้ใช้ / รหัสผ่าน ฉันไม่พบวิธีการกำหนดค่าปลั๊กอิน Git เพื่อใช้การรวมผู้ใช้ / รหัสผ่านอย่างง่ายดังนั้นฉันจึงเพิ่มคำสั่งเชลล์ต่อไปนี้เป็นขั้นตอนการสร้างล่วงหน้าบนเครื่องสร้างลินุกซ์ซึ่งขึ้นอยู่กับเครื่องมือที่คาดหวัง
นี่ไม่ใช่วิธีที่ดีในการแก้ไขปัญหานี้ตามรหัสผ่านของคุณที่แสดงให้เห็นว่าข้อความที่ชัดเจนในการกำหนดค่าและบันทึกของ JENKINS JOB! ใช้งานเฉพาะในกรณีที่ไม่มีวิธีกำหนดค่าการยืนยันคีย์ RSA-KEY หรือการกำหนดค่าอื่น ๆ !
rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'
เพิ่มบรรทัดเดียวAddKeysToAgent yes
ที่ด้านบนของไฟล์. ssh / config Ofcourse ssh-agent ต้องทำงานล่วงหน้า ถ้ามันไม่ทำงาน (ตรวจสอบโดยprep ssh-agent
) แล้วก็เรียกใช้มันeval $(ssh-agent)
ตอนนี้คีย์ถูกโหลดทั้งระบบลงในหน่วยความจำและคุณไม่จำเป็นต้องพิมพ์ข้อความรหัสผ่านอีกครั้ง
แหล่งที่มาของการแก้ปัญหาคือ/ubuntu/362280/enter-ssh-passphrase-once/853578#853578
ฉันพยายามหลีกเลี่ยงการพิมพ์ข้อความรหัสผ่านตลอดเวลาเพราะฉันใช้ ssh บน windows สิ่งที่ฉันทำคือแก้ไขไฟล์. profile ของฉันดังนั้นฉันจึงป้อนรหัสผ่านของฉันลงในเซสชันที่ต้องการ ดังนั้นนี่คือส่วนของรหัส:
SSH_ENV="$HOME/.ssh/environment"
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
echo succeeded
chmod 600 "$SSH_ENV"
. "$SSH_ENV" > /dev/null
ssh-add
}
# test for identities
function test_identities {
# test whether standard identities have been added to the agent already
ssh-add -l | grep "The agent has no identities" > /dev/null
if [ $? -eq 0 ]; then
ssh-add
# $SSH_AUTH_SOCK broken so we start a new proper agent
if [ $? -eq 2 ];then
start_agent
fi
fi
}
# check for running ssh-agent with proper $SSH_AGENT_PID
if [ -n "$SSH_AGENT_PID" ]; then
ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
if [ $? -eq 0 ]; then
test_identities
fi
# if $SSH_AGENT_PID is not properly set, we might be able to load one from
# $SSH_ENV
else
if [ -f "$SSH_ENV" ]; then
. "$SSH_ENV" > /dev/null
fi
ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
if [ $? -eq 0 ]; then
test_identities
else
start_agent
fi
fi
ดังนั้นเมื่อฉันพิมพ์ข้อความรหัสผ่านของฉันหนึ่งครั้งในเซสชัน ..
ฉันลองใช้คำแนะนำเหล่านี้และอื่น ๆ อีกมากมายดังนั้นฉันจึงสามารถคอมไพล์โคลนจากอินสแตนซ์ AWS ของฉันได้ ไม่มีอะไรทำงาน ในที่สุดฉันก็โกงออกจากความสิ้นหวัง: ฉันคัดลอกเนื้อหาของ id_rsa.pub บนเครื่องท้องถิ่นของฉันและผนวกเข้ากับ ~ / .ssh / known_hosts บนอินสแตนซ์ AWS ของฉัน