บังคับให้ SSH ใช้เปลือกเฉพาะ


29

มีวิธีใดที่จะบังคับให้ SSH ใช้เชลล์เฉพาะบนรีโมตปลายทางไม่ว่าเชลล์ดีฟอลต์ของผู้ใช้จะเป็นอะไร?

ฉันได้ลองใช้โซลูชันคล้ายกับ:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

แต่น่าเสียดายที่เชลล์เริ่มต้นบนรีโมตรับผิดชอบการแยกส่วน "คำสั่งที่ซับซ้อนหลายบรรทัด" และฉันมีปัญหาในการหลีกเลี่ยงมันเพียงพอที่จะทำงานได้ทั้งผู้ใช้ Bash และ C


คำตอบ:


8

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


1
นี่คือสิ่งที่ฉันทำในที่สุด แต่ใช้ scp ความคิดที่ดี
plinehan

16

ใช้ heredoc:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

คุณไม่ควรใช้ "-s" เพื่อทุบตีเพื่ออ่านคำสั่งจาก stdin?
Weboide

ไม่จำเป็นเสมอไป
Ignacio Vazquez-Abrams

ฉันจะลงคะแนนนี้ถ้าฉันทำได้เพราะมันป้องกันคำสั่งจากการเข้าถึง stdin และคำถามเกี่ยวกับการเรียกเปลือกเฉพาะ
Eric Woodruff

3
@EricWoodruff ... อัญเชิญเปลือกโดยเฉพาะอย่างยิ่ง (ในกรณีนี้ทุบตี) เป็นว่าสิ่งนี้แสดงให้เห็นวิธีการทำ
Charles Duffy

1
FYI cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bashคุณยังสามารถทำ ดังนั้นแทนที่จะขั้นตอนหนึ่งที่คุณมีสองขั้นตอนคือขั้นตอนที่ 1 คัดลอกสคริปต์ของคุณไปยังแฟ้มขั้นตอนที่ 2 สคริปต์เพื่อcat ssh
เทรเวอร์บอยด์สมิ ธ

10

ใช้การเข้าสู่ระบบแบบใช้คีย์ไม่ใช่รหัสผ่าน จากนั้นคุณสามารถเพิ่ม (รายการ) "คำสั่งบังคับ"ไปยังคีย์ ssh สาธารณะของคุณ (ในฟิลด์"ตัวเลือก"ในกรณีของ SSH1) ซึ่งติดตั้งบนเซิร์ฟเวอร์ (ในไฟล์~ / .ssh / authorized_keysสำหรับ SSH1 , ~ / .ssh2 / การอนุญาตสำหรับ SSH2)

สร้างคำสั่งบังคับของคุณเพื่อให้เชลล์ที่คุณต้องการเรียกว่า ...

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

อ่านข้อมูลเกี่ยวกับ "คำสั่งบังคับให้" ผ่านทาง Google


สิ่งที่ดี. กราฟิกในหน้า O'Reilly นั้นดีมาก อย่างไรก็ตามในกรณีของฉันฉันต้องการบังคับให้ผู้ใช้ทุกคนไม่เพียง แต่ผู้ใช้ที่ได้ตั้งค่าคีย์อย่างถูกต้อง ฉันยังไม่มีรูทบนเครื่องเซิร์ฟเวอร์ดังนั้นฉันจึงไม่สามารถแก้ไขไฟล์/etc/sshrcได้
plinehan

ก็มักจะเป็นเซิร์ฟเวอร์ (หรือดีกว่า: ผู้ที่ออกแรงควบคุมเซิร์ฟเวอร์) ที่โทรภาพเมื่อคุณเชื่อมต่อกับบริการ ... 'เจ้าของ' ของเซิร์ฟเวอร์ตัดสินใจว่าจะทำอะไรได้บ้าง - คุณไม่สามารถบังคับให้ 'ผู้ใช้คนใดก็ได้' หากคุณไม่มีสิทธิ์พิเศษมากกว่าพวกเขา
Kurt Pfeifle

หากลูกค้าสามารถเรียกใช้คำสั่งโดยพลการจากนั้นลูกค้าสามารถเรียกใช้เชลล์โดยพลการเป็นคำสั่งได้เช่นกัน
Eric Woodruff

@ KurtPfeifle ที่ลิงก์ไปยัง O'Reilly เสีย
Brian Vandenberg

@BrianVandenberg: ขอบคุณสำหรับคำใบ้ ฉันลบลิงค์นั้นทันที
Kurt Pfeifle

2

คุณสามารถใช้-tตัวเลือกเพื่อบังคับใช้การจัดสรรหลอกสำหรับโปรแกรมที่คุณต้องการเริ่มต้นราวกับว่าคุณกำลังดำเนินการเชลล์มาตรฐาน จากนั้นส่งเชลล์ที่คุณต้องการเป็นอาร์กิวเมนต์เก่าแบบธรรมดา

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

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

ไม่แน่ใจว่านี่เป็นเปลือกเข้าสู่ระบบ แต่มีตัวเลือกในการทุบตีทำหน้าที่เหมือนเปลือกเข้าสู่ระบบดังนั้นเปลือกของคุณอาจมีเช่นกัน


1

น่าแปลกที่ฉันเห็นผลลัพธ์ที่แตกต่างกันดังต่อไปนี้:

ทำงานในเส้นประ:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

แสดงคำสั่งที่ยกมาอย่างเต็มที่ทำงานได้ตามที่คาดไว้


1
ไม่น่าแปลกใจเลย ภูต SSH sh -c "$*"ระยะไกลได้อย่างมีประสิทธิภาพทำงาน ดังนั้นคุณกำลังใช้งานsh -c "/bin/bash -c echo <(cat)"; echoคำสั่งตัวเองเป็นอาร์กิวเมนต์เท่านั้นผ่านไป-cและ<(cat)เป็นข้อโต้แย้งที่แยกจากกันโดยสิ้นเชิง
Charles Duffy

0

ฉันต้องเผชิญกับสถานการณ์ที่คล้ายกันในขณะที่ฉันต้องการใช้ ksh coprocess สำหรับ sqlplus และฉันมี ssh เท่านั้นที่ต้องอ่านและเขียน

วิธีในการทำเช่นนี้คือไพพ์คำสั่งที่ขึ้นต่อกันทั้งหมดของคุณเป็นหนึ่งบรรทัด (ใช้;) ถึง / usr / bin / ksh บนเครื่องรีโมต ตัวอย่างเช่น:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.