จะปิดอุโมงค์ ssh นี้ได้อย่างไร? [ปิด]


101

ฉันเปิด ssh tunnel ตามที่อธิบายไว้ในโพสต์นี้: Zend_Db: จะเชื่อมต่อกับฐานข้อมูล MySQL ผ่านอุโมงค์ SSH ได้อย่างไร

แต่ตอนนี้ฉันไม่รู้ว่าจริงๆแล้วฉันทำอะไรลงไป คำสั่งนี้มีผลกับอะไรบนเซิร์ฟเวอร์หรือไม่? และฉันจะปิดอุโมงค์นี้ได้อย่างไรเพราะตอนนี้ฉันไม่สามารถใช้ mysql ในเครื่องได้อย่างถูกต้อง

ฉันใช้ OSX Lion และเซิร์ฟเวอร์ทำงานบน Ubuntu 11.10

คำตอบ:


247

สมมติว่าคุณรันคำสั่งนี้: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -Nตามที่อธิบายไว้ในโพสต์ที่คุณเชื่อมโยง

รายละเอียดของคำสั่ง:

  1. ssh: มันค่อนข้างอธิบายตัวเองได้ เรียกssh.
  2. -f:( จากman sshเพจ)

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

    โดยพื้นฐานแล้วส่ง sshไปที่พื้นหลังเมื่อคุณป้อนรหัสผ่านเพื่อสร้างการเชื่อมต่อ มันจะช่วยให้เปลือกกลับพรอมต์ให้คุณที่มากกว่าการเข้าสู่ระบบคุณในการที่จะlocalhostremote-host

  3. user@mysql-server.com: เซิร์ฟเวอร์ระยะไกลที่คุณต้องการเข้าสู่ระบบ
  4. -L 3306:mysql-server.com:3306: นี่คือบิตที่น่าสนใจ -L(จากman sshหน้า):

    [bind_address:] port: host: hostport ระบุว่าพอร์ตที่กำหนดบนโลคัลโฮสต์ (ไคลเอ็นต์) จะถูกส่งต่อไปยังโฮสต์ที่กำหนดและพอร์ตบนด้านรีโมต

    ดังนั้น-L 3306:mysql-server.com:3306ผูกโลคัลพอร์ต3306กับพอร์ตระยะไกล 3306mysql-server.comบนโฮสต์

    เมื่อคุณเชื่อมต่อท้องถิ่นพอร์ตการเชื่อมต่อจะถูกส่งต่อไปทั่วช่องทางที่ปลอดภัยเพื่อ3306 พื้นที่ห่างไกล , จากนั้นเชื่อมต่อกับพอร์ตmysql-server.commysql-server.commysql-server.com3306พอร์ต

  5. -N: อย่าดำเนินการคำสั่ง สิ่งนี้มีประโยชน์สำหรับ "เพียงการส่งต่อพอร์ต" (อ้างถึง man page)

คำสั่งนี้มีผลกับอะไรบนเซิร์ฟเวอร์หรือไม่?

ใช่มันสร้างการเชื่อมต่อระหว่างlocalhostและmysql-server.comบนพอร์ต3306 3306

แล้วจะปิดอุโมงค์นี้ได้อย่างไร ...

หากคุณเคยใช้-fคุณจะสังเกตเห็นว่าsshกระบวนการที่คุณเปิดอยู่เบื้องหลัง วิธีปิดที่ดีกว่าคือการเรียกใช้ps aux | grep 3306ค้นหาpidของssh -f ... -L 3306:mysql-server.com:3306 -Nและkill <pid>. (หรืออาจจะkill -9 <pid>ลืมไปว่าใช้killงานได้) มีประโยชน์ที่ดีในการไม่ฆ่าsshการเชื่อมต่ออื่น ๆ ทั้งหมดของคุณ หากคุณมีมากกว่าหนึ่งการสร้างใหม่อาจเป็นเรื่องเล็กน้อย ...

... เพราะตอนนี้ฉันไม่สามารถใช้ mysql ในพื้นที่ได้อย่างถูกต้อง

นี่เป็นเพราะคุณ "จับ" กระบวนการภายในเครื่อง ได้อย่างมีประสิทธิภาพmysqlและส่งต่อการรับส่งข้อมูลใด ๆ ที่พยายามเชื่อมต่อกับกระบวนการนี้ไปยังกระบวนการระยะไกล มาก nicerวิธีการแก้ปัญหาที่จะmysqlไม่ใช้พอร์ตท้องถิ่น 3306ในพอร์ตไปข้างหน้า ใช้สิ่งที่ไม่ได้ใช้เช่น 33060 (โดยทั่วไปตัวเลขที่สูงกว่าจะใช้น้อยกว่าเป็นเรื่องปกติที่จะใช้ชุดค่าผสมของพอร์ตฟอร์เวิร์ดเช่นนี้: "2525-> 25", "8080-> 80", "33060-> 3306" หรือ คล้ายกันทำให้จำง่ายขึ้นเล็กน้อย)

ดังนั้นถ้าคุณใช้ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -Nคุณต้องการฟังก์ชั่นแล้วชี้ Zend เชื่อมต่อไป MySQL ของคุณไปยังlocalhostพอร์ต33060ซึ่งจะเชื่อมต่อกับพอร์ตmysql-server.com 3306เห็นได้ชัดว่าคุณยังคงสามารถเชื่อมต่อlocalhostกับพอร์ต3306ดังนั้นคุณยังคงสามารถใช้mysqlเซิร์ฟเวอร์ภายในได้


5
คำอธิบายที่ดีที่สุดที่ฉันอ่านมาสักครู่ สิ่งนี้มีประโยชน์มากเมื่อเข้าถึงฐานข้อมูลระยะไกลจากสภาพแวดล้อมที่ติดตั้งในเครื่องเช่น R เป็นต้น ทำงานได้ดีกับการตรวจสอบสิทธิ์คีย์สาธารณะ / ส่วนตัว ไม่ใช่ด้วยรหัสผ่านเพราะฉันไม่พบวิธีส่งรหัสผ่าน
Matt Bannert

ยอมรับคำตอบนี้ดีที่สุดเนื่องจากมีคำอธิบายอย่างละเอียด
Jacob

คำตอบที่ดี! ยังไง-9ก็ตามไม่จำเป็นสำหรับการkillพิจารณาว่ากระบวนการยังทำงานได้ดี ;-)
Lucio Paiva

47

สิ่งนี้จะฆ่าเซสชัน ssh ทั้งหมดที่คุณเปิดจากเทอร์มินัล

sudo killall ssh

'ไม่พบกระบวนการที่ตรงกัน' มันกล่าว
Jacob

ดูเหมือนว่ามันเป็น Mysql ทำงานได้ดีเช่นกัน แต่ Apache ก็เริ่มบ่น ฉันทำการรีบูตและทุกอย่างทำงานตามที่คาดไว้ ปัญหาได้รับการแก้ไขฉันเดา :)
เจคอบ

5
คุณไม่ต้องการทำสิ่งนี้หากเป็นสภาพแวดล้อมที่
แยบยล

13
การเรียกใช้killall sshเป็นคำสั่งที่ค่อนข้างประมาท ฉันแนะนำให้ค้นหารายการกระบวนการของคุณ (เช่นps aux | grep sshตามที่ @simont แนะนำด้านบน) เพื่อค้นหารหัสกระบวนการเฉพาะของกระบวนการ ssh tunnel ของคุณ จากนั้นคุณสามารถฆ่าพีดโดยเฉพาะ
เบ็น

มีโอกาสดีที่คุณจะไม่ต้องการให้พวกเขาทั้งหมดถูกฆ่าตาย
wobbily_col

23

หมายเหตุ: เพิ่มเป็นคำตอบเนื่องจากความคิดเห็นไม่รองรับการบล็อกโค้ด

ในความคิดของฉันมันจะดีกว่าที่จะไม่ใช้และแทนที่จะเป็นเพียงแค่พื้นหลังการดำเนินการตามปกติ-f &ที่จะให้พีดที่คุณต้องการฆ่า:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

หรือดีกว่านั้นเพียงสร้างสิ่งนี้เป็นสคริปต์ wrapper:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash


12
การใช้งาน-fช่วยให้sshเซสชันดำเนินต่อไปได้แม้ว่าจะปิดเซสชันเทอร์มินัลซึ่งแตกต่างจากการกดไปที่พื้นหลัง การหยิบpidใช้ps aux | grep ssh | grep <LOCAL-PORT>เป็นเรื่องเล็กน้อย
simont

1
@simont ใช้ Explicit pid ที่ส่งคืนจากงานเบื้องหลังจะปลอดภัยกว่าไม่ว่าคุณจะใช้พื้นหลังอย่างไร หากคุณมีกระบวนการ ssh มากกว่าหนึ่งกระบวนการคุณจะมีช่วงเวลาที่ไม่ดี
รอน

การใช้-fยังมีข้อได้เปรียบในการแจ้งให้ผู้ใช้ภายในเครื่องป้อนรหัสผ่านเข้าสู่ระบบหากจำเป็น หากคุณใช้ผู้ใช้&จะไม่เห็นพรอมต์ดังกล่าวเว้นแต่พวกเขาจะนำกระบวนการไปที่เบื้องหน้า (เช่นโดยใช้fg)
Bdoserror


4
ครั้งแรกที่ <LOCAL-PORT> ของคุณเกิดขึ้นใน pid ของกระบวนการที่มีข้อความ 'ssh' อยู่ด้วย (เช่นกระบวนการ ssh หรือ sshd อื่นหรือแก้ไขไฟล์ที่มี 'ssh' ในชื่อ) คุณจะรู้ว่าสิ่งนี้ วิธีการในขณะที่สะดวกในสถานการณ์ที่เรียบง่าย แต่ไม่สามารถกันกระสุนได้
รอน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.