วิธีรับ pinentry-curses เพื่อเริ่มต้น tty ที่ถูกต้อง?


13

ฉันใช้gpg-agentสำหรับการจัดการทั้งอัตลักษณ์ของ PGP e SSH เอเจนต์เริ่มต้นด้วยสคริปต์เช่นนี้

gpg_agent_env="$XDG_CACHE_HOME/gpg-agent.env"

export GPG_TTY="$(tty)"

if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then
    eval "$({gpg-agent --daemon | tee $gpg_agent_env} 2> /dev/null)"
else
    source "$gpg_agent_env" 2> /dev/null
fi

ซึ่งมีที่มาเมื่อใดก็ตามที่ฉันเรียกใช้เปลือกโต้ตอบ ทุกอย่างทำงานได้ดีกับการตั้งค่านี้ แต่มีปัญหา สมมติว่าฉัน:

  1. เปิดเทอร์มินัล (เรียกตัวแทนในพื้นหลัง) และเริ่มทำงาน
  2. หลังจากที่ในขณะที่เปิดสถานีที่สอง
  3. ดำเนินการที่ต้องป้อนวลีรหัสผ่านในเทอร์มินัลที่สอง

ณ จุดนี้gpg-agentจะเริ่มpinentry-cursesพร้อมท์ข้อความรหัสผ่าน แต่จะทำเช่นนี้ในเทอร์มินัลแรกซึ่งส่งผลให้เอาต์พุตผสมกับสิ่งที่กำลังทำงานอยู่ (โดยปกติจะเป็นตัวแก้ไขข้อความ) โดยไม่มีวิธีการเริ่มโปรแกรมหรือหยุด pinentry (เริ่มใช้ 100% cpu และฉันต้องฆ่ามัน)

ฉันต้องทำอะไรผิดที่นี่ ใครมีประสบการณ์นี้

ปรับปรุง:

ฉันคิดว่าสิ่งนี้เกิดขึ้นเฉพาะเมื่อมีข้อความแจ้งให้ปลดล็อคคีย์ SSH ซึ่งมีลักษณะเช่นนี้ในขณะที่พร้อมท์สำหรับคีย์ PGP จะเปิดขึ้นบน tty ที่ถูกต้อง (เช่นปัจจุบัน)


คุณลองเริ่มตัวแทนจากเปลือกเข้าสู่ระบบของคุณเพื่อให้คุณมีเพียงหนึ่งทำงานอยู่?
jasonwryan

@ Jasonwryan ฉันได้ลอง: มันเป็นสิ่งเดียวกันสำหรับ linux terminal เสมือน (agetty) โดยวิธีในคำถามด้วย terminal ฉันหมายถึงหน้าต่าง terminal emulator
Rnhmjoj

1
มันคือการexport GPG_TTY="$(tty)"แก้ไขสำหรับฉัน
naisanza

คำตอบ:


11

หน้าคน gpg ตัวแทนอธิบายภายใต้ตัวเลือก--enable-ssh-supportที่โปรโตคอลตัวแทน SSH ไม่สามารถที่จะให้ชื่อของ TTY เพื่อตัวแทนเพื่อเป็นค่าเริ่มต้นโดยใช้ขั้วเดิมมันเริ่มต้นใน. ก่อนที่จะใช้คำสั่ง SSH ที่ต้องใช้ วลีรหัสผ่านในเทอร์มินัลใหม่ที่คุณต้องพิมพ์

gpg-connect-agent updatestartuptty /bye

ในเทอร์มินัลใหม่เพื่ออัพเดตมุมมองของเอเจนต์ที่จะใช้ tty หรือจอแสดงผล


1
คำตอบนี้ช่วยให้ฉันเข้าใจอย่างถ่องแท้ว่าคนที่รับผิดชอบgpg2ไม่มีแนวคิดเกี่ยวกับสิ่งที่ชอบที่จะมีเวิร์กโฟลว์ / การดำเนินชีวิตที่เป็นศูนย์กลางของบรรทัดคำสั่ง บางคนที่มีแนวคิดพื้นฐานเกี่ยวกับประสบการณ์การใช้งานคอมพิวเตอร์ทั่วไปที่เริ่มต้นและสิ้นสุดภายในขอบเขตของหน้าต่าง GUI ต้องทำการตัดสินใจที่มีผลต่อเครื่องมือที่ก่อนหน้านี้ใช้งานได้อย่างสะดวกสบายบนบรรทัดคำสั่ง
mtraceur

2
@mtraceur ไม่จริงมันเป็น ssh-agent ที่ผิดที่นี่: ในความเป็นจริง gpg2 จะแสดงพรอมต์บน tty ที่ถูกต้องเมื่อปลดล็อคคีย์ PGP เป็นผู้รับผิดชอบของ ssh-agent ที่อาจไม่เคยคิดที่จะเปลี่ยนไปใช้ tty อื่น
Rnhmjoj

2
@Rnhmjoj พวก SSH ควรสนับสนุน usecase การสลับ TTY หรือไม่ว่าไม่มีเครื่องมือบรรทัดคำสั่งสำหรับประวัติ Unix / Linux ส่วนใหญ่ที่ต้องการ? คุณรู้หรือไม่ว่ากระบวนการคิดการออกแบบและการตัดสินใจสำหรับส่วนใดของเวิร์กโฟลว์นั้นได้รับการจัดการโดยคำสั่งและเอเจนต์ถูกจัดการอย่างไร? ถ้าคุณเป็นบางทีคุณอาจจะช่วยให้ฉันเห็นสิ่งที่ฉันหายไปเพราะผมก็ไม่สามารถมองเห็นเส้นทางที่ชัดเจนถึงวิธีการมากต้องการหาตัวแทนในการ "เปลี่ยน" ทาง TTY แม้จะเกิดขึ้นเว้นแต่สถาปัตยกรรมก็ตัดสินใจได้โดยไม่ต้องพิจารณา การใช้บรรทัดคำสั่งทั่วไปและเวิร์กโฟลว์
mtraceur

1
@ArneBabenhauserheide ข้อแตกต่างคือgpgไม่สามารถขอข้อความรหัสผ่านบนเทอร์มินัลที่ไม่ถูกต้องในขณะที่gpg2สามารถทำได้ gpgคำสั่งมักจะถามหาข้อความรหัสผ่านบน terminal ที่คุณดำเนินการคำสั่งจากเพราะจริงการสร้างรหัสผ่านที่ทำจากว่าต้นไม้กระบวนการ แต่gpg2ถูกเข้ารหัสเช่นนั้นไม่สามารถมั่นใจได้เพราะจะต้องขอให้กระบวนการตัวแทนที่ใช้เวลานานแยกต่างหากเพื่อให้พร้อมท์สำหรับวลีรหัสผ่านและตัวแทนนั้นอาจเริ่มต้นในเทอร์มินัลอื่น gpg2และเอเจนต์สามารถทำได้ แต่ไม่ใช่รหัสเพื่อทำงานนี้
mtraceur

1
@ArneBabenhauserheide ถ้าคุณไม่ถามเกี่ยวกับความแตกต่างระหว่างตัวแทน SSH และ gpg2 เพราะถ้าเป็นเช่นนั้นแล้วความแตกต่างคือ SSH ที่ไม่จำเป็นต้องใช้ในทางที่ผิดของเครื่องมืออื่น ๆ ที่มีในเชิงรุกบอกตัวแทนโดยเฉพาะกับขั้วสวิทช์ในพื้นหลังนี้ (เท่าที่ฉันรู้ - และถ้ามันไม่ได้แล้วฉันมีการวิพากษ์วิจารณ์เดียวกันสำหรับมันเกินไป ) การgpg2ออกแบบนั้นสมเหตุสมผลถ้ามีการใช้งานโดยผู้ที่ไม่ได้มองข้ามประเด็นที่เกี่ยวกับ CLI เกี่ยวกับการทำงานของ Linux / Unix และไม่มีความรู้สึกที่ดีในสิ่งที่ทำให้ส่วนต่อประสานและเครื่องมือที่ดีสำหรับการแต่งโดยรวม
mtraceur

5

ตามข้อผิดพลาดอัปสตรีมกับ openssh วิธีที่เหมาะสมในการนี้คือการเพิ่มสิ่งต่อไปนี้ในของคุณ~/.ssh/config:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

สิ่งนี้ได้ผลสำหรับฉันอย่างสมบูรณ์จนถึงตอนนี้


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