บอก SSH ให้ใช้พรอมต์กราฟิกสำหรับคีย์รหัสผ่าน


40

ฉันจะบังคับให้ SSH ร้องขอข้อความรหัสผ่านโดยใช้กราฟิกแสดงพร้อมท์ (เช่น GTK) แทนมาตรฐานที่ใช้เทอร์มินัลได้อย่างไร

ฉันลองตั้งค่าSSH_ASKPASS=/usr/bin/ssh-askpassแต่ดูเหมือนว่าจะไม่มีผลกระทบ

ปัญหาคือความจริงที่ว่าเอกสาร openssh พูดว่า

หาก ssh ไม่มีเทอร์มินัลที่เชื่อมโยงกับมันแต่ตั้งค่า DISPLAY และ SSH_ASKPASS มันจะรันโปรแกรมที่ระบุโดย SSH_ASKPASS และเปิดหน้าต่าง X11 เพื่ออ่านวลีรหัสผ่าน

SSH เปิดตัวจากบรรทัดคำสั่งในกรณีของฉันเป็นผลมาจากที่git push, จะมีขั้วที่เกี่ยวข้องกับมันดังนั้นSSH_ASKPASSตรรกะดูเหมือนว่าจะถูกละเว้น

โปรดทราบว่าฉันไม่ได้อ้างถึงssh-addแต่เป็นการอ้างถึงssh ทั่วไปที่มีต่อโฮสต์ซึ่งมีคู่กุญแจอยู่ แต่ได้รับการคุ้มครองโดยข้อความรหัสผ่าน

คำตอบ:


31

# 1 - แพ็คเกจที่ขาดหายไป?

คุณอาจไม่มีแพ็คเกจที่บรรจุssh-askpassอยู่ ลองติดตั้ง

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

$ sudo apt-get install ssh-askpass-gnome ssh-askpass

การหาสาธารณูปโภคที่ขาดหายไป

คุณสามารถค้นหาเครื่องมือที่หายไปโดยใช้คำสั่งเหล่านี้:

Fedora / CentOS / RHEL:

$ yum search ssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
======================================================= Matched: ssh-askpass =======================================================
x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH
ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support
connect-proxy.x86_64 : SSH Proxy command helper
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X

Debian / Ubuntu:

$ apt-file -l search ssh-askpass
app-install-data
cruft
git-cola
luckybackup-data
pssh
sdm-terminal
seahorse
ssh-askpass
ssh-askpass-fullscreen
ssh-askpass-gnome

# 2 - ตัดการเชื่อมต่อเทอร์มินัล?

ฉันพลาดสิ่งนี้ไปก่อน แต่หลังจากอ่านต่อฉันสังเกตเห็นความคิดเห็นนี้ในหน้าคนsshเกี่ยวกับSSH_ASKPASSตัวแปรสภาพแวดล้อม

สิ่งที่สกัดมา

SSH_ASKPASS    If ssh needs a passphrase, it will read the passphrase from the 
               current terminal if it was run from a terminal.  If ssh does not
               have a terminal associated with it but DISPLAY and SSH_ASKPASS 
               are set, it will execute the program specified by SSH_ASKPASS 
               and open an X11 window to read the passphrase. This is particularly
               useful when calling ssh from a .xsession or related script.  
               (Note that on some machines it may be necessary to redirect the 
               input from /dev/null to make this work.)

หากคุณสังเกตเห็นในความคิดเห็นแสดงว่า ssh "ไม่มีเทอร์มินัลที่เชื่อมโยง" และ DISPLAY & SSH_ASKPASSถูกตั้งค่าไว้ การสังเกตเห็นนี้เป็นกุญแจสำคัญ เพื่อที่sshจะใช้งานSSH_ASKPASSเราจำเป็นต้องsshไม่ติดตั้งเทอร์มินัล (aka. STDIN& STDOUT) ไว้

setsidวิธีหนึ่งที่จะทำเช่นนี้โดยการใช้คำสั่ง อย่ารู้สึกแย่ ฉันไม่เคยได้ยินเครื่องมือนี้เช่นกัน จากหน้าคน:

setsid - เรียกใช้โปรแกรมในเซสชั่นใหม่

ดังนั้นหากเราเรียกใช้sshเป็น "โปรแกรม" setsidเราสามารถแยกออกsshจากการประชุม terminal ของเราตามเกณฑ์ที่กล่าวไว้ในsshหน้าคน เกณฑ์อื่น ๆ ที่กำหนดไว้ดังต่อไปนี้:

$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass

ดังนั้นหากเรารวมทั้งหมดเข้าด้วยกัน:

$ setsid ssh user@remotehost

ตัวอย่างเช่น:

$ setsid ssh user@skinner

                                       เอสเอสของถามกุย

วิธีแก้ปัญหา

หากคุณต้องการที่จะทำให้มันsetsidเป็น "ในตัว" คุณสามารถสร้างชื่อแทนดังนี้:

$ alias ssh="setsid ssh"

ตอนนี้เมื่อคุณsshจะได้รับ GUI เปิดขึ้นเพื่อขอรหัสผ่านของคุณ:

$ ssh user@skinner

อ้างอิง


ssh-askpass gnome ได้รับการติดตั้งและใช้งานได้ดีหากเปิดใช้งานด้วยตนเอง
gioele

@gioele - ดูอัปเดตฉันคิดว่าฉันหาคำตอบแล้ว
slm

ปัญหาของการแก้ปัญหานี้ก็คือว่ามันกำหนดให้ข้าพเจ้าต้องปรับเปลี่ยนแต่ละคอมไพล์หรือ rsync คำสั่งที่จะใช้setsid sshinstad sshธรรมดา
gioele

@gioele - คุณขอวิธีการ "บังคับ" รหัสผ่าน GUI สิ่งนี้ให้สิ่งนั้น คุณสามารถแทนที่คำสั่งเช่นsshwith aliases setsid sshเป็นวิธีการหนึ่ง มีวิธีอื่น ๆ ปัจจัย จำกัด คือ openssh ไม่จำเป็นต้องแนบ TTY เพื่อเปิดใช้งาน ASK_SSHPASS
slm

ฉันไม่ได้ขาดแพ็คเกจและไม่สามารถใช้setsidงานได้sshจากเทอร์มินัลของฉัน นั่นไม่ใช่คำตอบที่ถูกต้อง! นอกจากนี้มันยังทำงานในอูบุนตูรุ่นเก่าดังนั้นฉันไม่แน่ใจด้วยซ้ำว่าฉันเข้าใจว่าทำไมหยุดทำงานทันที
Alexis Wilke

8

มันไม่สามารถทำได้ใน OpenSSH ปัจจุบัน: มีปัญหาเปิดใน OpenSSH Bugzilla ขอคุณลักษณะนี้เป็นของ 2013-07: คุย SSH_ASKPASS


สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
cuonglm

8
@cuonglm "นี่เป็นไปไม่ได้" เป็นคำตอบ มันอาจจะผิดหรือทำให้เข้าใจผิด (ฉันไม่ได้บอกว่าเป็น) แต่ก็ยังเป็นคำตอบ
terdon

2

มีวิธีปิดเทอร์มินัลสำหรับคำสั่งเดียวและใช้การเปลี่ยนเส้นทางไฟล์:

ssh-add > /dev/null < /dev/null 2>&1

สิ่งนี้จะเรียกใช้คำสั่งssh-addเมื่อปิดเทอร์มินัล ซึ่งเป็นสิ่งที่ดีและสวยงามยกเว้นความซับซ้อนของมัน แต่ตอนนี้คุณรู้คำสั่งที่ถูกต้องเพียงแค่ทำให้มันเป็นนามแฝงและผนวกเข้ากับ~/.bash_aliases:

alias ssh-add="/usr/bin/ssh-add > /dev/null < /dev/null 2>&1"

และคุณควรจะตั้ง เพียงพิมพ์ssh-addตอนนี้จะเรียกใช้นามแฝงซึ่งจะเรียกใช้คำสั่งจริงพร้อมการเปลี่ยนเส้นทางทั้งหมด

ssh-addอย่างถูกต้องขอให้คุณใช้รหัสผ่านที่มีกล่องโต้ตอบ ... โดยมีเงื่อนไขว่าคุณมีหนึ่งของแพคเกจเหล่านี้ติดตั้ง (ในอูบุนตูหรือสัญญาซื้อขายล่วงหน้าพวกเขาอาจมีชื่ออื่น ๆ ที่อื่น ๆ ):

  • ssh-askpass
  • ssh-askpass-fullscreen
  • ssh-askpass-gnome
  • ksshaskpath
  • kwalletcli
  • lxqt-openssh-askpass
  • razorqt-openssh-askpasss

ทีนี้สิ่งเหล่านั้นหมายความว่าอย่างไร?

2>&1วิธีการเปลี่ยนเส้นทางไฟล์อธิบาย # 2 (ข้อผิดพลาดมาตรฐาน) เดียวกันไฟล์ที่บ่ง # 1 (ออกมาตรฐาน) เป็นผู้กำกับ

> /dev/nullวิธีการเปลี่ยนเส้นทางออกมาตรฐาน/dev/nullซึ่งเป็นไฟล์พิเศษที่เหลือใช้ข้อมูลทั้งหมดที่เขียนไป

< /dev/nullวิธีการเปลี่ยนเส้นทางเข้ามาตรฐานไป/dev/null(เหมือนเดิม)

ในฐานะบันทึกย่อด้านข้างและหัวข้อปิด แต่บันทึกย่อที่เกี่ยวข้องหากคุณต้องการตั้งโปรแกรมบริการเป็นทุบตีคุณต้องจำไว้ว่าบริการจริงๆคืออะไรกระบวนการที่มีอินพุตมาตรฐานเอาต์พุตและข้อผิดพลาดปิดอยู่ในพื้นหลัง:

service > /dev/null < /dev/null 2>&1 &

โปรดสังเกตว่าความแตกต่างเพียงอย่างเดียวคือ & เพิ่มที่ส่วนท้าย (บวกกับความจริงที่ว่าฉันเปลี่ยนคำสั่งssh-addสำหรับเชิงทฤษฎีserviceคำสั่งเหล่านั้นจะให้บริการอย่างถูกต้องบนพื้นหลัง


ขอขอบคุณสำหรับคำตอบโดยละเอียด Victor อย่างไรก็ตามมันไม่ตรงกับความต้องการของฉัน ตามที่ฉันเขียนเมื่อสิ้นสุดคำถาม«โปรดทราบว่าฉันไม่ได้อ้างถึง ssh-add แต่เป็นการเรียกใช้ ssh ทั่วไปไปยังโฮสต์ที่มีคู่คีย์อยู่ แต่ได้รับการป้องกันด้วยวลีรหัสผ่าน»
gioele

ฉันเห็น. ดีsshฟังก์ชั่นในลักษณะเดียวกันที่แน่นอนและคำตอบเดียวกันผมให้ก่อนหน้านี้ยังคงใช้ เพียงแทนที่ทุกเหตุการณ์ที่เกิดขึ้นssh-addด้วยsshและคุณจะถูกตั้งค่า
Victor

มีรายละเอียดเล็ก ๆ น้อย ๆ ที่คุณลืม: ถ้าฉันปิด stdin / stdout สำหรับ ssh ฉันจะสั่งการผ่าน ssh ได้อย่างไร? ;)
gioele

สิ่งนี้ใช้ได้ssh-addสำหรับฉัน - ฉันไม่จำเป็นต้องเปลี่ยนเส้นทาง stdout / stderr เพื่อให้ได้พฤติกรรมตามที่ต้องการซึ่งก็คือการเปิดssh-askpassโปรแกรมขึ้นมา (นั่นคือssh-add < /dev/nullเพียงพอแล้ว)
เบ็นสเติร์น

0

ฉันมีปัญหาเดียวกันเมื่อฉันติดตั้งม้าน้ำ (ซึ่งมีseahorse-ssh-askpass) โดยไม่ต้องติดตั้งแพคเกจgnome-keyringบน ArchLinux

การดูเนื้อหาของแพ็คเกจนี้gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) อาจช่วยคุณแก้ปัญหาของคุณได้

ไม่ว่าในกรณีใดถ้าคุณไม่สนใจใช้ม้าน้ำคุณสามารถติดตั้งแพ็คเกจseahorseและgnome-keyring(หรือสิ่งที่เทียบเท่าสำหรับการแจกจ่ายของคุณ) หากคุณไม่ได้ใช้คำพังเพยขั้นตอนเพิ่มเติมอาจจะจำเป็นต้องใช้: https://wiki.archlinux.org/index.php/GNOME_Keyring

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