เหตุใด ssh-agent จะไม่บันทึกรหัสที่ไม่ได้เข้ารหัสของฉันเพื่อใช้ในภายหลัง


12

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

คุณมีความคิดว่าทำไมสิ่งนี้อาจจะ? มันอาจเป็นอะไรที่ง่ายอย่างที่ssh-agentไม่ได้กำลังทำงานอยู่หรือบางอย่าง

รหัสเดียวกันบนเดสก์ท็อป Ubuntu Gnome ของฉันทำงานได้ดี ทั้งเซิร์ฟเวอร์และเดสก์ท็อปกำลังใช้งาน Ubuntu 10.10

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent

1
ก่อนอื่นอย่างที่คุณพูดให้ตรวจสอบว่าssh-agentมันกำลังทำงานอยู่หรือไม่ps -ef | grep '[s]sh-agent'
Scott Severance

@mssever อ๋อมันดูเหมือนจะเป็น ดูคำถามที่ปรับปรุง
Treffynnon

คำตอบ:


10

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

หากคุณกำลังใช้ bash ให้สร้างไฟล์ที่~/.bash_profileมีเนื้อหานี้:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

แก้ไขชื่อไฟล์~/.ssh/id_dsaตามความต้องการของคุณและเพิ่มบรรทัดนี้~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

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


ขอบคุณ @enzotib มันใช้งานได้ดีสำหรับการsshเข้าไปในเครื่องอื่น ๆ แต่มันไม่ได้เมื่อใช้gitเพื่อผลักดันหรือดึงที่เก็บสาธารณะ คุณมีความคิดใดบ้างที่ฉันสามารถแก้ไขได้เช่นกัน?
Treffynnon

เพิ่มฟังก์ชั่นเหมือนกันssh()เรียกว่าgit()และเปลี่ยนบรรทัดสุดท้ายจากไป/usr/bin/ssh นอกจากนี้ยังเพิ่มบรรทัดสุดท้ายกับ/usr/bin/git export -f git
enzotib

@enzotib ฉันลองใช้มัน แต่ตอนนี้เมื่อฉันsshเข้าไปในเครื่องด้วยbash_profileไฟล์ที่คุณสร้างขึ้นจากการตั้งค่ามันจะถามรหัสผ่านของกุญแจ ด้วยเหตุผลบางอย่างตอนนี้เวลาผม ssh ในทุกถามแม้กระทั่งก่อนที่ผมจะได้ดำเนินการหรือssh gitดูgist.github.com/942082สำหรับข้อความแจ้งที่ฉันได้รับเมื่อลงชื่อเข้าใช้เครื่องที่ละเมิด
Treffynnon

@Treffynnon: ฉันไม่รู้ว่าจะgitโต้ตอบกันอย่างไรsshและฉันไม่ได้ใช้gitเพื่อที่ฉันจะได้ลองไม่ได้ ฉันได้แก้ไขการ~/.bash_profileรวมgit()ฟังก์ชันที่กล่าวถึงข้างต้นเพื่อให้แน่ใจว่าคำอธิบายก่อนหน้าของฉันชัดเจน นอกจากนี้ดูเหมือนว่าจากผลลัพธ์ที่คุณแสดงให้เห็นว่าคุณปรับเปลี่ยนเครื่องเซิร์ฟเวอร์ แต่คำแนะนำของฉันทั้งหมดถูกนำไปยังเครื่องไคลเอนต์เท่านั้น
enzotib

@enzotib นั่นถูกต้อง เซิร์ฟเวอร์ที่ฉันลงชื่อเข้าใช้กลายเป็นไคลเอนต์ของฉันเมื่อฉันgitกดไปที่ศูนย์กลางการเคลื่อนย้าย / พื้นที่เก็บข้อมูลจากมันดังนั้นไฟล์อยู่ในตำแหน่งที่ถูกต้อง ฉันคิดว่าคุณเพิ่งให้คำแนะนำกับฉัน / เขย่าความคิดของฉัน pwdฉันมีความพรอมต์ทุบตีพิเศษที่แสดงสาขาคอมไพล์ของ ฉันเดิมพันนั่นคือสิ่งที่เรียกใช้รหัสผ่านในการล็อกอิน bash เพราะมันพยายามคอมไพล์สถิติก่อนที่จะแสดง bash prompt!
Treffynnon

2

ฉันเพิ่งเริ่มใช้ ssh-ident:

https://github.com/ccontavalli/ssh-ident

สิ่งที่คุณต้องทำคือเพิ่มสิ่งที่ชอบ:

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

.bashrcในของคุณ หรือคุณสามารถln -s /path/to/ssh-ident ~/bin/sshหรือบางไดเรกทอรีอื่น ๆ ในเส้นทางของคุณก่อนและ/bin/usr/bin


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.