2016-10-18 5 views
-1

Я пишу сценарий для входа на сервер шлюза и с сервера шлюза к узлам, которые имеют доступ только через шлюзBASH - войти на сервер, а затем другой сервер

Мой сценарий выглядит следующим образом:

#!/bin/bash 

cool() { 
    ssh -A SERVER << EOF 
    ls -l 
EOF 
} 


fool() { 
    ssh -A GATEWAY << EOF 
     touch foobar 
     $(cool) 
EOF 
} 

export -f cool 
export -f fool 

fool 

Итак, что происходит, я вхожу в GATEWAY и запускаю несколько команд. Затем, когда я вызываю функцию «cool» в ssh в узел, она делает это, но затем начинает считывать сообщение с заставки и выполняет неверную команду. Я хочу, чтобы он выполнял «ls -l» в функции cool!

О, и избавиться от заставки - это не вариант!

+0

«* затем начинает считывать сообщение с экрана заставки и выполняет неверную команду *« - что? Что такое «заставка» и что такое «команда», о которой вы говорите? – melpomene

+0

Когда я вхожу в сервер SERVER, есть экран spalsh , который сообщает мне последний раз, когда я вошел в этот сервер; –

+0

команда, которую я хочу запустить, это «ls -l», но она начинает выполнение «вашего последнего входа .....» –

ответ

0

Как сделать проксирование в SSH

Я предполагаю, что вы настроить аутентификацию Публичных, так что вам не нужно писать пароли. SSH имеет очень хорошие возможности для проксирования и при создании файла конфигурации в ~/.ssh/config, она работает очень хорошо:

Host SERVER 
    ProxyCommand ssh -W %h:%p GATEWAY 

, то вы можете подключиться к серверу с помощью одной команды ssh SERVER. Если вам нужно выполнить некоторые команды, добавьте его после этого ssh SERVER "ls -l".

Как исправить свои ошибки

Сфера вашей функции cool ограничивается в сценарий, и поэтому он не признаваемые в HEREDOC по конвейеру на второй ssh. Если вы хотите использовать функцию во второй оболочке, вам нужно определить ее в своей области.

Также вызов функции как $(cool) запускает функцию в подпроцессе, чего вы не хотите. Вы хотите вызвать функцию напрямую.

#!/bin/bash 
fool() { 
    ssh -A GATEWAY << EOF 
     cool() { 
      ssh -A SERVER << EOF2 
      ls -l 
EOF2 
     } 
     touch foobar 
     cool 
EOF 
} 

export -f fool 

fool 
+0

Это решение - это * только * вещь, которую вы хотите использовать. GATEWAY - это вход в SERVER, но здесь это не так. – chepner

+0

@chepner Да, это решение, как это сделать правильно, а не как исправить основные проблемы в OPs-коде 'bash'. Но да, было бы лучше попытаться это исправить. – Jakuje

0

Проблема заключается в том, что вы вообще не можете экспортировать функции (или что-нибудь) по ssh связи. Если вы хотите запустить функцию на удаленном хосте, ее необходимо определить там.

#!/bin/bash 


fool() { 
    ssh -A GATEWAY << EOF 
     touch foobar 
     cool() { 
      ssh -A SERVER <<EOF2 
       ls -l 
EOF2 
     } 
     cool 
EOF 
} 

fool 

 Смежные вопросы

  • Нет связанных вопросов^_^