Я пытаюсь написать bash-скрипт для ssh сначала в IP1(запрашивает пароль) с моего локального компьютера, а затем ssh в IP2. Однажды в IP2 я хочу, чтобы scp к моей локальной машине.

IP1=192.168.10.10
IP2=192.168.10.9

ssh root@$IP1
ssh root@$IP2

cd /var/log

scp message* localuser@$localIP:/home/localuser/Desktop/MessageFolder/

Выше я должен сделать это вручную через командную строку в Linux. Я по сути копирую из 192.168.10.9 на мою локальную машину

У меня нет прямого доступа к IP2. Думайте об этом как о бэкдоре. У IP2 есть пароль, у IP1 нет.

Есть какой-либо способ сделать это? Я написал больше кода, если это не помогло.

Может ли кто-нибудь проверить, могу ли я сделать что-то похожее на то, что было сделано для этого решения: Scp поверх прокси с одной командой с локального компьютера?

Я также слышал о переадресации портов ... Как это будет работать с этим примером?

Я очень новичок в написании сценариев Bash и был бы признателен за терпение.

3 ответа3

0

Вы не можете запустить скрипт на одном компьютере, затем запустить ssh на другом компьютере и продолжить выполнение сценария.

Но вы можете выполнить последовательность команд на удаленной машине следующим образом:

ssh -t root@IP1 'ssh root@IP2 scp /var/log/message*  <user>@<IP>:/home/localuser/Desktop/MessageFolder/; ls /var/log/message*'

Это говорит ssh на IP1 и передает оставшуюся часть строки как команду для запуска после входа в систему.

В кавычках указывается команда для запуска, которая представляет собой ssh для второго IP-адреса вместе с командой для запуска после входа в систему.

0

Просто дай мне понять это правильно:

  • localIP хочет файлы в /home /localuser /Desktop /MessageFolder /
  • требуемые файлы находятся на IP2 в /var /log /message *
  • Единственный способ получить доступ к IP2 с IP1

Вам нужно будет использовать ssh/scp с использованием ключей вместо паролей, как описано в https://wiki.archlinux.org/index.php/SSH_keys. Я бы также посоветовал не использовать пользователя root для этой основной операции.

Предполагая, что эти предположения верны, вы можете использовать возможность туннелирования SSH, чтобы машина localIP могла подключиться по ssh/scp к 127.0.0.1:SomeUnusedPort, чтобы добраться до IP2. Основная сложность заключается в том, чтобы узнать, когда следует отключить локальную IP-машину от IP1-машины.

Это быстрый блок кода, чтобы сделать то, что я думаю. Имейте в виду, я не проверял это вообще.


IP1=192.168.10.10
IP2=192.168.10.9
SomeUnusedPortOnLocalIP=2209

ssh -L $SomeUnusedPortOnLocalIP $IP2:22 root@$IP1 "while [ ! -f /tmp/disconLocalIP.now ]; do sleep 2; done; rm /tmp/disconLocalIP.now " &
# connects to IP1 establishing an ssh tunnel between localIP and IP2
# the loop testing for the existence of a file to let it know when to disconnect
# the & symbol lets the command run in the background and the script to continue with it still running

# wait for the connection to actually establish fully before proceeding.
sleep 10 

# connect to port tunnel on localIP to get files from IP2
scp -P $SomeUnusedPortOnLocalIP root@$127.0.0.1:/var/log/message* /home/localuser/Desktop/MessageFolder/
scp -P $SomeUnusedPortOnLocalIP root@$127.0.0.1:/var/log/log* /home/localuser/Desktop/OtherLogs/

# put file on IP1 to tell loop to end and exit previous ssh session
ssh root@$IP1 "touch /tmp/disconLocalIP.now"

0

SSH поддерживает это. Я процитирую ответы отсюда:

согласно справочной странице ssh, ProxyCommand является правильным методом

синтаксис:

ProxyCommand ssh -W %h:%p user@jumphost 2> /dev/null

Или в достаточно новой системе:

Начиная с OpenSSH 7.3 (конец 2016 года), самый простой способ - это настройка ProxyJump . В вашем ~/.ssh/config:

Host B
  ProxyJump A

Или в командной строке, -J B .

Последнее решение даже поддерживает сколь угодно глубокие цепочки, см. Руководство.

С SCP вы не можете использовать -J , поэтому это будет выглядеть так:

scp -o "ProxyJump root@$IP1" root@$IP2:/var/log/message* /home/localuser/Desktop/MessageFolder/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .