ssh -L आगे कई पोर्ट्स


129

मैं वर्तमान में इसका एक गुच्छा चला रहा हूं:

sudo ssh -L PORT:IP:PORT root@IP

जहाँ IP एक सुरक्षित मशीन का लक्ष्य है, और PORT उन बंदरगाहों का प्रतिनिधित्व करता है जो मैं अग्रेषित कर रहा हूँ।

ऐसा इसलिए है क्योंकि मैं बहुत सारे अनुप्रयोगों का उपयोग करता हूं, जिन्हें मैं इस अग्रेषण के बिना एक्सेस नहीं कर सकता। इस प्रदर्शन के बाद, मैं के माध्यम से उपयोग कर सकते हैं localhost:PORT

मुख्य समस्या अब यह हुई कि मेरे पास वास्तव में इनमें से 4 बंदरगाह हैं जिन्हें मुझे आगे करना है।

मेरा समाधान 4 गोले खोलना है और लगातार अपने इतिहास को पीछे की ओर देखना है ताकि वास्तव में पता चल सके कि किन बंदरगाहों को आगे बढ़ाया जाना है, और फिर इस कमांड को चलाएं - प्रत्येक शेल में एक (पासवर्ड आदि भरने के लिए)।

अगर केवल मैं ही कुछ कर सकता था:

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

तब वह पहले से ही वास्तव में मदद करेगा।

क्या ऐसा करना आसान बनाने का कोई तरीका है?

जवाबों:


195

-Lविकल्प एक ही आदेश के अंतर्गत कई बार निर्दिष्ट किया जा सकता। हर बार अलग-अलग पोर्ट से।


20
पहले तो मुझे यह उत्तर समझ में नहीं आया। ऐसे में अगर कोई भी ऐसा करता है तो यहां एक उदाहरण पोस्ट करना। लेखक का अर्थ था "ssh -L port0: ip: port0 -L port1: ip: port1 ..."
Mong H. Ng

96

वास्तव में NaN ने जो उत्तर दिया है, आप कई -L तर्क निर्दिष्ट करते हैं। मेरे द्वारा हमेशा ऐसा ही किया जाता है। यहाँ बहु पोर्ट अग्रेषण का एक उदाहरण है:

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

नोट : यह वही है जैसे -L localhost:8822:REMOTE_IP_1:22कि आप निर्दिष्ट नहीं करते हैं localhost

अब इसके साथ, आप अब (दूसरे टर्मिनल से) कर सकते हैं:

ssh localhost -p 8822

REMOTE_IP_1पोर्ट पर कनेक्ट करने के लिए22

और इसी तरह

ssh localhost -p 9922

REMOTE_IP_2पोर्ट पर कनेक्ट करने के लिए22

बेशक, आपको इसे स्क्रिप्ट में लपेटने से कोई रोक नहीं सकता है या यदि आपके पास आगे और कुछ विशिष्ट लोगों के लिए कई अलग-अलग होस्ट / पोर्ट हैं तो इसे स्वचालित करें।

उम्मीद है की यह मदद करेगा।


नान के जवाब के लिए महान पूरक। धन्यवाद।
AFP_555

1
इसके बारे में सावधान रहें: "ध्यान दें: यह वही है जो -L लोकलहोस्ट: 8822: REMOTE_IP_1: 22 है यदि आप लोकलहोस्ट को निर्दिष्ट नहीं करते हैं।" यह केवल तभी सच है जब गेटवेपोर्ट्स सेटिंग 'नहीं' है, जो कि डिफ़ॉल्ट रूप से है। लेकिन निहितार्थों पर विचार करते हुए अगर यह नहीं है, तो आपको सेटिंग को सत्यापित करना चाहिए या, बेहतर अभी भी, स्पष्ट होना चाहिए और "-L लोकलहोस्ट: 8822" का उपयोग करें।
डेविड

मैं @ By default, anyone (even on different machines) can connect to the specified port on the SSH client machine. However, this can be restricted to programs on the same host by supplying a bind address: ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com दाविद ssh.com/ssh/tunneling/example
कार्ल

24

आप निम्नलिखित बैश फ़ंक्शन का उपयोग कर सकते हैं (बस इसे अपने में जोड़ें ~/.bashrc):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

उपयोग उदाहरण:

pfwd hostname {6000..6009}

2
-fपृष्ठभूमि में चलाने के लिए उपयोग करें
कार्ल पोकस

एहम्म्म ... तुम ऐसा क्यों चाहते हो?
एंटोन बेसोनोव

14

एक ही मेजबान के माध्यम से कई पोर्ट अग्रेषित कर रहे लोगों के लिए कुछ इस तरह से उनके ~ / .shsh / config में सेटअप कर सकते हैं

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

और यह एक सरल ssh all-port-forwardsदूर हो जाता है।


मुझे यह तरीका पसंद है।
बीएमडब्ल्यू

8

jbchichoko और युवल ने व्यवहार्य समाधान दिए हैं। लेकिन jbchichoko का जवाब एक फ़ंक्शन के रूप में एक लचीला जवाब नहीं है, और युवल के उत्तर द्वारा खोली गई सुरंगों को बंद नहीं किया जा सकता ctrl+cक्योंकि यह पृष्ठभूमि में चलता है। मैं दोनों दोषों को हल करने के लिए नीचे अपना समाधान देता हूं:

में एक समारोह में हार ~/.bashrcया~/.zshrc :

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

फ़ंक्शन चलाने का एक उदाहरण:

fsshmap 6000 6010 hostname

इस उदाहरण का परिणाम:

आप के 127.0.0.1:16000~16009रूप में ही उपयोग कर सकते हैंhostname:6000~6009


3

पोर्ट फ़ॉरवर्डिंग वाले सर्वर में प्रवेश करने के लाभों में से एक जुपिटर नोटबुक के उपयोग की सुविधा है। यह लिंक इसे कैसे प्रदान करता है का एक उत्कृष्ट विवरण प्रदान करता है। यहाँ मैं आप सभी लोगों के लिए कुछ सारांश और विस्तार करना चाहूंगा।

स्थिति 1. होस्ट-ए नामक एक दूरस्थ कार्य मशीन को होस्ट-ए (जैसे आपका अपना लैपटॉप) नामक स्थानीय मशीन से लॉगिन करें।

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

फिर आप एक ब्राउज़र खोल सकते हैं और होस्ट-बी पर अपना काम करने के लिए http: // localhost: port_A / दर्ज कर सकते हैं लेकिन इसे होस्ट-ए में देख सकते हैं।

स्थिति 2. होस्ट-ए नामक एक रिमोट मशीन से होस्ट-ए नामक स्थानीय मशीन से लॉगिन करें और वहां से होस्ट-सी नामक रिमोट वर्क मशीन में लॉगिन करें। यह आमतौर पर विश्वविद्यालयों के भीतर अधिकांश विश्लेषणात्मक सर्वर के लिए मामला है और इससे ssh -Lजुड़े दो का उपयोग करके प्राप्त किया जा सकता है -t

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

फिर आप एक ब्राउज़र खोल सकते हैं और होस्ट-सी पर अपना काम करने के लिए http: // localhost: port_A / दर्ज कर सकते हैं लेकिन इसे होस्ट-ए में देख सकते हैं।

स्थिति 3. होस्ट-बी नामक रिमोट लॉगिन मशीन के लिए होस्ट-ए (जैसे आपका अपना लैपटॉप) नामक स्थानीय मशीन से लॉगिन करें और वहां से होस्ट-सी नामक रिमोट वर्क मशीन में लॉगिन करें और अंत में रिमोट वर्क मशीन में लॉगिन करें- डी यह आमतौर पर मामला नहीं है, लेकिन कभी-कभी हो सकता है। यह स्थिति 2 का विस्तार है और अधिक मशीनों पर एक ही तर्क लागू किया जा सकता है।

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

फिर आप एक ब्राउज़र खोल सकते हैं और होस्ट-डी पर अपना काम करने के लिए http: // localhost: port_A / दर्ज कर सकते हैं लेकिन इसे होस्ट-ए में देख सकते हैं।

ध्यान दें कि port_A, port_B, port_C, port_D यहां सूचीबद्ध सामान्य पोर्ट संख्याओं को छोड़कर यादृच्छिक संख्या हो सकती है । स्थिति 1 में, port_A और port_B प्रक्रिया को सरल बनाने के लिए समान हो सकते हैं।


एक अनुस्मारक, विभिन्न सर्वरों पर समान पोर्ट अलग-अलग पोर्ट हैं। इसलिए यह हमेशा समान पोर्ट नंबर निर्दिष्ट करके चीजों को आसान बना सकता है!
फी याओ

3

मेरी कंपनी में दोनों मेरे और मेरे टीम के सदस्यों को तो मैं एक बनाया एक गैर पहुंच योग्य "लक्ष्य" सर्वर के 3 बंदरगाहों तक पहुंच की आवश्यकता स्थायी सुरंग (एक सुरंग है कि चला सकते हैं यह है कि पृष्ठभूमि में , अनिश्चित काल के लिए पैरामीटर को देखने -fऔर -N) करने के लिए एक ही पहुंचा जा सकता सर्वर से लक्ष्य एक। पहुंच योग्य सर्वर की कमांड लाइन पर मैंने अमल किया:

ssh root@reachableIP -f -N  -L *:8822:targetIP:22  -L *:9006:targetIP:9006  -L *:9100:targetIP:9100

मैंने उपयोगकर्ता का उपयोग किया है rootलेकिन आपका अपना उपयोगकर्ता काम करेगा। आपको चुने हुए उपयोगकर्ता का पासवर्ड दर्ज करना होगा (भले ही आप उस उपयोगकर्ता के साथ पहले से उपलब्ध सर्वर से जुड़े हों)।

अब पहुंच योग्य मशीन का पोर्ट 8822 लक्ष्य एक (ssh / PuTTY / WinSCP के लिए) के पोर्ट 22 से संबंधित है और उपलब्ध मशीन पर पोर्ट 9006 और 9100 लक्ष्य एक के समान पोर्ट से मेल खाता है (वे मेरे मामले में दो वेब सेवाओं को होस्ट करते हैं) )।


1

मैंने ssh अग्रेषण के साथ मदद के लिए लोको विकसित किया है । इसका उपयोग बंदरगाहों पर स्थानीय रूप से 5000 और 7000 बंदरगाहों को समान बंदरगाहों पर साझा करने के लिए किया जा सकता है:

pip install loco

loco listen SSHINFO -r 5000 -r 7000

1

यदि आप एक सरल समाधान चाहते हैं जो पृष्ठभूमि में चलता है और मारना आसान है - एक नियंत्रण सॉकेट का उपयोग करें

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST

1

यहाँ एक समाधान युवल एट्ज़मन से प्रेरित है।

प्रारंभिक समाधान पर इसके कुछ लाभ हैं:

  • पहले यह एक एकल पृष्ठभूमि प्रक्रिया बनाता है और प्रति पोर्ट एक नहीं
  • यह उर्फ ​​उत्पन्न करता है जो आपको अपनी सुरंगों को मारने की अनुमति देता है
  • यह केवल 127.0.0.1 पर बांधता है जो थोड़ा अधिक सुरक्षित है

आप इसका उपयोग कर सकते हैं:

  • tnl your.remote.com 1234
  • tnl your.remote.com {1234,1235}
  • tnl your.remote.com {1234..1236}

और अंत में उन सभी को मार दें tnlkill

function tnl {
  TUNNEL="ssh -N "
  echo Port forwarding for ports:
  for i in ${@:2}
  do
    echo " - $i"
    TUNNEL="$TUNNEL -L 127.0.0.1:$i:localhost:$i"
  done
  TUNNEL="$TUNNEL $1"
  $TUNNEL &
  PID=$!
  alias tnlkill="kill $PID && unalias tnlkill"
}

-1

आप इस zsh फ़ंक्शन का उपयोग कर सकते हैं (संभवतः बैश के साथ भी काम करता है) (इसे डालें ~/.zshrc):

ashL () {
    local a=() i
    for i in "$@[2,-1]"
    do
        a+=(-L "${i}:localhost:${i}")
    done
    autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]"
}

उदाहरण:

ashL db@114.39.161.24 6480 7690 7477

ashL db@114.39.161.24 {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.