การค้นหา IP หรือชื่อโฮสต์ของเครื่องต้นทาง (ssh)


10

ฉันเชื่อมต่อกับเครื่องจำนวนมากอย่างต่อเนื่องจากสถานที่ตั้งทางกายภาพที่แตกต่างกัน ส่วนใหญ่นี้จะทำแม้ว่า SSH บางครั้งเครื่องเกตเวย์หรือสองจะต้อง (ซึ่งผมวิงวอนผ่านProxyCommandใน~/.ssh/config) ฉันต้องการทราบว่ามีวิธีการระบุ IP หรือชื่อโฮสต์ของเครื่องที่เรียกการเชื่อมต่อเริ่มต้น (เช่นเครื่องที่ฉันกำลังทำงาน) อยู่ที่ปลายรีโมตหรือไม่

  • ฉันไม่ต้องการส่งตัวแปรสภาพแวดล้อมเนื่องจากบางเครื่องไม่มีการตั้งค่าPermitUserEnvironmentรูต
  • $SSH_CLIENTตัวแปรสภาพแวดล้อมจะเป็นประโยชน์สำหรับการเชื่อมต่อโดยตรง แต่จะแสดงเฉพาะประตูล่าสุด

แนวคิดปัจจุบันของฉันสำหรับโซลูชันคือการคว้าเอา$SSH_CLIENTไปหา$SSH_CLIENTค่าของเครื่องและทำซ้ำจนกว่าจะไม่มี จากนั้นคว้าชื่อโฮสต์และดึงกลับมาอย่างใด

ดูเหมือนว่างานแฮ็คเล็กน้อย ไม่มีใครมีวิธีที่ดีกว่า

ฉันทำงานในเชลล์ทุบตีเป็นส่วนใหญ่ แต่ฉันก็มีความสุขสำหรับคำแนะนำที่ไม่ได้ใช้เช่นกัน


หนึ่งในวัตถุประสงค์ของ ProxyCommand เป็นหลักสูตรที่จะซ่อน (หรือลืมเกี่ยวกับ) โฮสต์กำเนิด (ซึ่งอาจจะเป็นตัวอย่างไม่ routable จากโฮสต์สุดท้ายแล้ว)
ฮาเจนฟอน Eitzen

คุณสามารถยกตัวอย่างที่คุณต้องการข้อมูลนี้ได้หรือไม่ อาจมีวิธีแก้ไขปัญหาอื่น ๆ ที่ไม่ชัดเจน
Manwe

@Manwe ในที่สุดฉันจะต้องการตั้งค่าส่วนเฉพาะของโลแคลในสิ่งต่างๆเช่น. bashrc ของฉัน ตอนนี้สิ่งที่ฉันต้องทำคือการตั้งค่าหนึ่งในสามรูปแบบแป้นพิมพ์โดยอัตโนมัติในกลุ่มขึ้นอยู่กับเครื่องที่ฉันทำงาน
Geodesic

คำตอบ:


3

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

ssh remote_host

คุณจะทำอะไรบางอย่างตามสายของ

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

สิ่งนี้คือสิ่งที่จะให้ SSH อย่างอื่นแทนที่จะเปิดเปลือกเข้าสู่ระบบ บางสิ่งนั้นเป็นสตริงซึ่งจะถูกเรียกใช้เป็นคำสั่งจากระยะไกล เราใช้สิ่งนี้เพื่อเปิดตัวเชลล์ในลักษณะพิเศษมาก: เราให้ตัวแปรสภาพแวดล้อมDAT_ORIGIN_HOSTซึ่งมีไอพีของเราบน eth0 (คุณอาจต้องเปลี่ยนมัน)

เคล็ดลับที่เราดำเนินการคือการที่เราใส่คำสั่งในการดำเนินการระยะไกลใน "qoutes เครื่องหมายอัญประกาศคู่ (อย่างน้อยเป็น Bash) หมายถึงว่าก่อนที่ STRING จะผ่าน SSH เชลล์ของเราจะทำการสแกนและทำการขยาย / แทนที่ตามความเหมาะสม ซึ่งหมายความว่าเชลล์ของเราจะประเมินส่วน `$ (ifconfig ... ) ไปยังที่อยู่ IP ปัจจุบันของเราและส่งสตริงที่มีคำจำกัดความสำหรับตัวแปรสภาพแวดล้อมด้วยที่อยู่ IP ท้องถิ่นของเรา

เมื่อเข้าสู่เครื่องระยะไกลecho $DAT_ORIGIN_HOSTควรพิมพ์ที่อยู่ IP ของคุณ

เพื่อพัฒนาการโทรไปที่ SSH ฉันลงมืออย่างไร้ที่ติจากที่นี่เพื่อแยกที่อยู่ IPและที่นี่เพื่อ -t และวิธีการเปิดตัวบางอย่างแบบโต้ตอบ

Disclaimer: ผมไม่แน่ใจเกี่ยวกับการ-lและตัวเลือกในการ-i /bin/bashบางทีคุณอาจต้องการละเว้นพวกเขา


คุณอาจจะมีบางอย่างที่นี่! ฉันจะเล่นกับมันสักครู่แล้วกลับไปหาคุณ
ธรณีวิทยา

ฉันกำลังทำเครื่องหมายคำตอบนี้เนื่องจากทั้งสองคำสั่งหลอกและคำสั่งระยะไกลทำงาน ในที่สุดฉันก็ได้แก้ไขกรณีเฉพาะของฉันด้วยการเรียกกลับ ^ E ตามข้อเสนอแนะคำสั่งระยะไกล - มันกลายเป็นการทำความสะอาดเล็กน้อยและการใช้งานทั่วไป ขอบคุณ!
ธรณีวิทยา

2

รหัสฉันเข้าใจถูกต้องว่าคุณกำลังเชื่อมต่อโดยตรงจากเครื่องต้นทางไปยังปลายทางด้วยproxycommandฮ็อป และนี่คือสามแฮ็กสำหรับคุณ (เพิ่มสามหลังจากความคิดเห็นในสถานการณ์การใช้งาน) ขั้นแรก) ใช้การส่งต่อพอร์ตระยะไกลเพื่อให้คุณกลับไปที่เครื่องต้นทางด้วย-R remotemachineport:dstonlocalnet:dstportonlocalnet

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

ประการที่สอง) ใช้ผิดAcceptEnv LC_*วัตถุประสงค์ มันไม่ดี แต่มันค่อนข้างธรรมดาที่จะอนุญาตให้ใช้ตัวแปร LOCALE แม้ whan AcceptUserEnviconment จะไม่สามารถใช้ได้ ดังนั้นตอนนี้คุณสามารถทำได้:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

สาม) ใช้ ssh รีโมตไปข้างหน้าเพื่อระบุโฮสต์หรือประเภทโฮสต์

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

ตอนนี้เชื่อมต่อกับการส่งต่อพอร์ต:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target

ขอบคุณสำหรับคำแนะนำ แต่ยังไม่ได้ผลเท่าที่ฉันพอใจ รีโมตพอร์ตไปข้างหน้าไม่ใช่ความคิดที่ดี แต่ข้อสันนิษฐานที่จำเป็นคือคุณมีชื่อผู้ใช้เดียวกันกับโฮสต์ทั้งหมด นั่นไม่ใช่กรณีที่นี่หรือสิ่งที่ฉันสามารถเปลี่ยนแปลงได้ ประการที่สอง: ฉันไม่สามารถทำงานนี้ได้ คุณจะบอกว่าAcceptEnv LC_*เป็นโดยทั่วไปได้รับอนุญาต แต่ไม่ได้เป็นมาตรฐานโดยตั้งค่าเริ่มต้น?
Geodesic

LC_ นั้นถูกกระทบแล้ว ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับวิธีการที่แพร่หลาย แต่เป็นสิ่งที่อาจทำงาน .. (อย่าลืมส่งออก LC_SOURCEHOST ก่อนการเชื่อมต่อ ssh)
Manwe

ผ่านการทดสอบ LC_ * และใช้งานได้ มันสามารถตัวแปรใด ๆ ที่ระบุไว้ในคำสั่งในAcceptEnv /etc/ssh/sshd_configอย่าลืมรีสตาร์ทsshdถ้าไฟล์นี้มีการเปลี่ยนแปลง
david.perez

1

คุณสามารถพิมพ์who -mที่ปลายทางระยะไกลเพื่อรับข้อมูลเกี่ยวกับผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน (รวมถึงชื่อโฮสต์) whoให้ข้อมูลเกี่ยวกับผู้ใช้ที่เข้าสู่ระบบและ-mสวิตช์จะแสดง "ชื่อโฮสต์และผู้ใช้ที่เกี่ยวข้องกับ stdin" เท่านั้น


สิ่งนี้มีประโยชน์เฉพาะในกรณีที่ฉันไม่ได้ทำการส่งสัญญาณผ่านเครื่องเกตเวย์
ธรณีวิทยา

0

คุณลองต่อไปนี้หรือไม่?

 netstat -an | grep " 22 "

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