การรัน ssh-agent จากเชลล์สคริปต์


19

ฉันพยายามที่จะสร้างเชลล์สคริปต์ที่เหนือสิ่งอื่นใดเริ่มต้นขึ้น ssh-agent และเพิ่มคีย์ส่วนตัวให้กับตัวแทน ตัวอย่าง:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

ปัญหาของเรื่องนี้คือ ssh-agent เริ่มต้นใหม่จาก $ SHELL (ในกรณีของฉัน, ทุบตี) และจากมุมมองของสคริปต์มันถูกดำเนินการทุกอย่างและ ssh-add และสิ่งใด ๆ ข้างล่างนี้จะไม่ทำงาน

ฉันจะเรียกใช้ ssh-agent จากเชลล์สคริปต์ของฉันและทำให้มันย้ายลงในรายการคำสั่งได้อย่างไร

คำตอบ:


8

ssh-agent ควรเริ่มเซสชันและเมื่อเสร็จสิ้นเซสชันผู้ใช้จะสิ้นสุด ดังนั้นคำสั่งใด ๆ หลังจาก ssh-agent อาจจะถูกดำเนินการหลังจากออกจากระบบ

สิ่งที่คุณต้องการคือ a session-scriptที่มีคำสั่งเซสชันของคุณดังนี้:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

ssh-agent session-scriptจากนั้นเริ่มต้น


ขอบคุณ! การสร้างสคริปต์แยกและสิ้นสุดสคริปต์ด้วยการexitทำเคล็ดลับ
Dan

2
สคริปต์เซสชันคืออะไร
Alexander Mills

15

ใส่ต่อไปนี้ที่ด้านบนของสคริปต์ของคุณ:

eval `ssh-agent`

สคริปต์ของคุณควรมีลักษณะเช่นนี้:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

คำอธิบาย

backticks รอบ ๆssh-agentรวบรวมผลลัพธ์ evalรวบรวมเอาต์พุตนั้นเชื่อมต่อมันไว้ในคำสั่งเดียวจากนั้นเรียกใช้งานคำสั่ง จากนั้นคุณสามารถใช้ssh-addเพื่อให้ข้อมูลประจำตัวที่สำคัญของคุณ


9
นี่คือสิ่งที่ฉันต้องการขอบคุณแม้ว่ามูลค่าชี้ให้เห็นว่า backticks กำลังจะออก ในรูปแบบทุบตีใหม่มันควรจะเป็นeval $(ssh-agent)
sibaz

วิธีนี้ไม่ได้ผลสำหรับฉันจนกว่าฉันจะbash -iจบสคริปต์
Adolfo Correa

6

ฉันมักจะทำสิ่งนี้ในสคริปต์ที่ต้องการตัวแทน

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

โดยพื้นฐานแล้วสิ่งแรกคือสคริปต์ตรวจสอบเพื่อดูว่าเอเจนต์ทำงานอยู่หรือไม่ หากไม่ได้ใช้ exec จะเริ่มกระบวนการใหม่แทนสคริปต์ เอเจนต์เริ่มทำงานมีการเพิ่มคีย์และในที่สุดสคริปต์จะถูกเรียกอีกครั้ง (ดู$0)


แต่นั่นจะไม่รักษาพารามิเตอร์สคริปต์ใด ๆ และถ้าพารามิเตอร์ใดมีช่องว่างมันจะไม่ง่ายต่อการส่งผ่านไป
Denilson Sá Maia

3
คุณสามารถใช้.. "ssh-add ; $0 $*"หรือ.. "ssh-add ; $0 $@"แทนซึ่งอาจทำงานได้ ซึ่งจะไม่สมบูรณ์แบบ แต่จะทำงานในหลายกรณีอย่างแน่นอน ทางออกที่ดีที่สุดคือการให้ตัวแทนของคุณทำงานก่อนสิ่งอื่นใดเสมอนี่เป็นเพียงบางสิ่งที่อาจมีประโยชน์ในกรณีที่คลุมเครือ
Zoredache

6

ฉันพบว่ามันใช้งานได้สำหรับฉัน

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

ฉันสร้างกระบวนการ ssh-agent เพิ่มคีย์ทำสิ่งที่ฉันต้องทำแล้วฆ่ามัน ไม่จำเป็นต้องตรวจสอบว่ามันทำงานในภายหลัง


4

มันจะดีกว่าที่จะใช้พวงกุญแจในกรณีนี้

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

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

eval `keychain --eval id_rsa`

ดีขึ้นหรือไม่ ทำไมจะดีกว่า
JFlo

@JFlo "ดีกว่า" ในนั้นมันจะบันทึกตัวแปร env ไปที่ $ HOME / .keychain / <file> การรันคำสั่งนั้นอีกครั้งจะดึงเอเจนต์ ssh-agent ที่มีอยู่หากยังทำงานอยู่ มันสามารถนำกลับมาใช้ใหม่ได้ระหว่างเชลล์ / สคริปต์ ในบางสถานการณ์ที่ไม่ปลอดภัยมากคุณต้องโทรออก สำหรับฉันมันเป็นการปรับปรุงสคริปต์บางอย่างที่ฉันเขียนเพื่อทำงานเดียวกันให้สำเร็จ
Scott Carlson

2

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

ฉันพบว่าวาง shebang ต่อไปนี้ไว้บนสุดของสคริปต์แล้ว:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

ฉันได้ลองแล้วมากมายและวิธีแก้ปัญหาที่ใช้งานได้ในที่สุดก็คือการแทนที่ข้อความรหัสผ่านของฉันด้วยสตริงว่าง

ssh-keygen -p

นี่เป็นวิธีปฏิบัติที่ไม่ปลอดภัยมาก ทำไมต้องใช้ ssh เลย? หากคุณไม่ปกป้องรหัสส่วนตัวของคุณคุณอาจกำลังคุยกันด้วยข้อความที่ชัดเจน
JFlo

@JFlo: ไม่หากระบบไคลเอ็นต์ของคุณปลอดภัยเพียงพอซึ่งอาจเป็นไปได้ โดยเฉพาะอย่างยิ่งถ้าคุณ (และสามารถทำได้) เพิ่ม ACL, SELinux หรือคล้ายกันซึ่งง่ายกับไฟล์คงที่ แต่น้อยกว่านั้นด้วยซ็อกเก็ตแบบสุ่มของ ssh-agent ที่กล่าวว่าฉันมักจะไม่แนะนำเป็นตัวเลือกแรก
dave_thompson_085

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