คำตอบนี้พัฒนาทั้งตามคำตอบที่เลือกโดยเพิ่มความปลอดภัยมากขึ้น
คำตอบนั้นกล่าวถึงรูปแบบทั่วไป
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
ที่มีความปลอดภัยอาจจะขาดอยู่ในsshสิทธิ์อนุญาตให้<user B>ในการhost B>ที่จะsshเข้ามาhost Aและดำเนินการใด ๆคำสั่ง
แน่นอนว่าBการAเข้าถึงอาจได้รับการระบุด้วยsshรหัสแล้วและอาจมีรหัสผ่านด้วย แต่การรักษาความปลอดภัยอีกชั้นหนึ่งสามารถ จำกัด ขอบเขตของคำสั่งที่อนุญาตซึ่งBสามารถดำเนินการได้Aเช่นนั้นrm -rf /ไม่สามารถเรียกได้ (นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อsshคีย์ไม่มีรหัสผ่าน)
โชคดีที่sshมีในตัวคุณสมบัติที่เรียกว่าข้อ จำกัด คำสั่งหรือคำสั่งบังคับ ดูssh.comหรือคำถาม serverfault.comนี้
โซลูชันด้านล่างแสดงโซลูชันแบบฟอร์มทั่วไปพร้อมกับssh การบังคับใช้ข้อ จำกัด คำสั่ง
ตัวอย่างโซลูชันที่เพิ่มข้อ จำกัด คำสั่ง
โซลูชันที่ปรับปรุงด้านความปลอดภัยนี้ตามรูปแบบทั่วไปการโทรจากsshเซสชันบนhost-Bเป็นเพียง:
cat <file> | ssh <user-A>@<host A> to_clipboard
ส่วนที่เหลือจะแสดงการตั้งค่าเพื่อให้ใช้งานได้
การตั้งค่าข้อ จำกัด คำสั่ง ssh
สมมติว่าบัญชีผู้ใช้เปิดBคือuser-Bและ B มีคีย์ ssh id-clipที่สร้างขึ้นตามปกติ ( ssh-keygen)
จากนั้นในuser-Aไดเรกทอรี ssh มีไฟล์
/home/user-A/.ssh/authorized_keys
ที่จดจำรหัสid-clipและอนุญาตsshการเชื่อมต่อ
โดยปกติเนื้อหาของแต่ละสายจะตรงคีย์สาธารณะได้รับอนุญาตเช่นเนื้อหาของauthorized_keysid-clip.pub
อย่างไรก็ตามเพื่อบังคับใช้ข้อ จำกัด คำสั่งว่าเนื้อหาคีย์สาธารณะนั้นได้รับการจัดทำขึ้น (ในบรรทัดเดียวกัน) โดยคำสั่งที่จะดำเนินการ
ในกรณีของเรา:
command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>
คำสั่งที่กำหนด"/home/user-A/.ssh/allowed-commands.sh id-clip"และเฉพาะคำสั่งที่กำหนดว่าจะดำเนินการเมื่อใดก็ตามที่สำคัญid-clipถูกนำมาใช้เริ่มต้นการsshเชื่อมต่อhost-A- ไม่ว่าสิ่งที่คำสั่งเป็นลายลักษณ์อักษรsshบรรทัดคำสั่ง
คำสั่งระบุไฟล์สคริปต์allowed-commands.shและเนื้อหาของไฟล์สคริปต์นั้นคือ
#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
Id=${1}
case "$SSH_ORIGINAL_COMMAND" in
"to-clipboard")
notify-send "ssh to-clipboard, from ${Id}"
cat | xsel --display :0 -i -b
;;
*)
echo "Access denied"
exit 1
;;
esac
การโทรไปsshที่เครื่องBเดิมคือ
... | ssh <user-A>@<host A> to_clipboard
สตริงto-clipboardจะถูกส่งไปโดยตัวแปรสภาพแวดล้อมallowed-commands.sh SSH_ORIGINAL_COMMANDนอกจากนี้เราได้ผ่านชื่อของคีย์ที่id-clipจากเส้นในที่มีการเข้าถึงโดยเฉพาะauthorized_keysid-clip
เส้น
notify-send "ssh to-clipboard, from ${Id}"
เป็นเพียงกล่องข้อความป๊อปอัพเพื่อแจ้งให้คุณทราบว่ากำลังเขียนคลิปบอร์ดซึ่งอาจเป็นคุณลักษณะด้านความปลอดภัยที่ดีเช่นกัน ( notify-sendทำงานบน Ubuntu 18.04 อาจจะไม่ใช่คนอื่น)
ในสาย
cat | xsel --display :0 -i -b
พารามิเตอร์--display :0จำเป็นเนื่องจากกระบวนการไม่มี X display เป็นของตัวเองพร้อมคลิปบอร์ดดังนั้นจึงต้องเจาะจงอย่างชัดเจน ค่านี้:0จะทำงานกับ Ubuntu 18.04 กับเซิร์ฟเวอร์หน้าต่าง Wayland ในการตั้งค่าอื่น ๆ อาจไม่ทำงาน สำหรับเซิร์ฟเวอร์ X มาตรฐานคำตอบนี้อาจช่วยได้
host-A /etc/ssh/sshd_config พารามิเตอร์
ในที่สุดพารามิเตอร์บางตัวใน/etc/ssh/sshd_configโฮสต์Aที่ควรตั้งค่าเพื่อให้แน่ใจว่าได้รับอนุญาตให้เชื่อมต่อและสิทธิ์ในการใช้ssh-key เท่านั้นโดยไม่ต้องใช้รหัสผ่าน:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
เพื่อให้sshdเซิร์ฟเวอร์อ่านการกำหนดค่าอีกครั้ง
sudo systemctl restart sshd.service
หรือ
sudo service sshd.service restart
ข้อสรุป
มันเป็นความพยายามในการตั้งค่า แต่ฟังก์ชั่นอื่น ๆ นอกเหนือจากto-clipboardสามารถสร้างขึ้นในแบบคู่ขนานกรอบเดียวกัน
:'<,'>w !ssh desktop pbcopy