ตัวเลือกที่เกี่ยวข้อง. ssh / config คืออะไรสำหรับ ssh -N


13

ฉันต้องการตั้งค่านามแฝงในไฟล์กำหนดค่าของฉันที่มีผลลัพธ์เหมือนกับคำสั่งนี้:

ssh -N devdb -L 1234:127.0.0.1:1234

รายการ. ssh / config ของฉันสำหรับdevdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

ฉันจะใส่อะไรในการตั้งค่าด้านบนเพื่อไม่เริ่มเชลล์?


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

คำตอบ:


22

ดังนั้นในssh.cOpenSSH 7.6p1 เราจึงพบ

            case 'N':
                    no_shell_flag = 1;
                    options.request_tty = REQUEST_TTY_NO;

ดังนั้น-Nสองสิ่ง:

  • no_shell_flagปรากฏเฉพาะในssh.cและมีการเปิดใช้งานเฉพาะสำหรับ-Wหรือ-Nตัวเลือกมิฉะนั้นมันจะปรากฏในบล็อกตรรกะบางที่เกี่ยวข้องกับการControlPersistและสติตรวจสอบที่เกี่ยวข้องกับส้อมพื้นหลัง ฉันไม่เห็นวิธีที่ตัวเลือกสามารถตั้งค่าได้โดยตรง
  • ตามสอดคล้องกับตัวเลือกรายละเอียดในreadconf.crequest_ttyRequestTTYssh_config(5)

ใบนี้ (นอกเหนือจากการปะติดลิง OpenSSH และรวบรวมใหม่หรือขอssh_configตัวเลือกเพื่อสลับno_shell_flagกับ ... ) บางสิ่งเช่น:

Host devdb
 User someuser
 HostName the_hostname
 LocalForward 1234 127.0.0.1:1234
 RequestTTY no
 RemoteCommand cat

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


1
+1 สำหรับการทำภายใน.ssh/config... ทำได้ดีมาก!
WEBjuju

การวิจัยที่ยอดเยี่ยมสำหรับคำตอบนี้! ขอบคุณ!
กลมกล่อมสีเหลือง

RemoteCommand exec sleep infinityฉันชอบ
มัส

3

@thrig มีคำตอบที่ถูกต้องตามความต้องการของคุณในการทำสิ่งนี้ภายใน .ssh/config

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


sshn() {
  # set your desired host and port forwarding as default
  # and allow them to be passed in if you should need it

  host="${1:-devdb}"
  port="${2:-1234:127.0.0.1:1234}"

  # now all you have to do is `sshn` and it will connect

  echo "executing ssh -N $host -L $port"
  ssh -N "$host" -L "$port"
}

นี่คือสามตัวอย่างของการใช้งาน: โดยไม่มี args ค่าเริ่มต้นที่ระบุในฟังก์ชั่นที่ใช้:

$ sshn
executing -N devdb -L 1234:127.0.0.1:1234

ด้วยค่าเริ่มต้นทันเนลรันบนโฮสต์อื่น:

$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234

ด้วยค่าเริ่มต้นทั้งสองให้เรียกใช้แบบเต็มครั้งเดียวไปยังโฮสต์ / อุโมงค์ใหม่:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345

0

คำสั่งรีโมตที่มีประโยชน์มากขึ้นตามคำตอบของ @ thrig:

Host someHost
Hostname 1.2.3.4
LocalForward 15673 localhost:15672
RequestTTY no
RemoteCommand bash -c 'echo "Listening on port 15673"; read -r -d '' _'

จะปิดกั้นการเชื่อมต่อจนกว่าจะกดผู้ใช้read -r -d '' _control+c

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