В bash (и других оболочках) можно вставить результат команды в командную строку, используя что-то вроде $() и `` (обратные кавычки).
Теперь было бы неплохо, если бы у вас было что-то подобное, но для сеансов ssh. Итак, вы находитесь в сеансе ssh и вам нужна некоторая информация с вашего компьютера, и вы хотите поместить ее во внутреннюю командную строку на машине, к которой вы подключены.
Например, вы хотите напрямую получить доступ к консоли mysql. Вы можете использовать команду вроде этой:
ssh [email protected] "mysql -u blub -pmypass"
Это работает, но проблема в том, что вы можете увидеть пароль в командной строке процесса оболочки ssh.
Чтобы решить эту проблему безопасности, я бы хотел иметь что-то вроде этого:
ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"
который будет выполняться cat passfile
на ssh-клиенте, а не на сервере. Известно ли что-нибудь подобное? Есть ли у вас другие трюки, как это сделать?
ОБНОВЛЕНИЕ: Я ценю ответы, которые ссылаются на мой пример, но я не приму их, если они не отвечают на настоящий вопрос. То есть, возможно ли связаться с клиентским компьютером ssh из сеанса ssh. (Я знаю, что это может представлять собой возможную проблему безопасности)
Возможные решения:
- Наличие SSH-сервера на клиенте для обратного подключения. (sweimann) Проблема в том, как получить учетные данные для обратного подключения к серверу.
- Создание туннеля с помощью ssh и использование скрипта netcat/telnet для выполнения команд на сервере и отправки результата обратно.
- Используйте expect для написания скрипта оболочки. (Зак Томпсон)
- Используйте специальную оболочку вокруг ssh на клиенте, наблюдая за консолью и предпринимая соответствующие действия. (Саппоро)
- Патч SSH для поддержки этого. Похожий патч есть в списке рассылкидоступный.
- Есть опция «SendEnv» длясшкоторый устанавливает переменные среды на удаленном компьютере. Однако это должно быть включено на удаленном sshd.
решение1
Вы хотите использоватьожидатьдля этого. Он, вероятно, уже есть на вашей машине. Это стандартный инструмент для любого вида интерактивной автоматизации командной строки. Это библиотека Tcl, так что вы получите некоторые навыки Tcl по ходу дела бесплатно. Осторожно, это вызывает привыкание.
#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact
решение2
Попробуйте использовать <.
сш[email protected]"mysql -u blub -p" < файл
Если первая строка в «файле» — ваш пароль, то он «должен» использоваться для запроса пароля, а остальная часть будет использоваться для части SQL.
Если вы просто выполняете файл SQL на удаленном сервере, попробуйте:
сш[email protected]"mysql -u blub -p < файл.sql" < пароль
решение3
Я изучал основную проблему несколько лет назад. Я хотел запустить загрузку SCP изнутри сеанса SSH. Как и ваша проблема, это требует связи изнутри сеанса SSH с каким-то процессом на клиенте.
Итак, вот третье возможное решение: подключиться с помощью оболочки вокруг SSH, которая сканирует вывод SSH и запускает определенные команды локально, когда распознает шаблон. Это, очевидно, хак, но он может сработать.
В итоге я получил модифицированную версию /usr/bin/script, которая запоминала мое SSH-подключение (например, me@somehost
), и всякий раз, когда мой сеанс ssh выводил ###/some/absulte/path/to/file/on/host.txt###
, он выполнялся локальноscp me@somehost:/some/absulte/path/to/file/on/host.txt .
Для удобного создания шаблона и абсолютного пути на сервере использовался простой скрипт оболочки.
(На самом деле мой код делал немного больше: он открывал локальный текстовый редактор для загруженного файла и повторно загружал его с помощью SCP, когда файл был изменен. Дайте мне знать, если вам нужен код.)
С тех пор я искал более удачную реализацию этого, но пока не нашел.
Возможно, этот метод можно реализовать в виде команды SSH-прокси (например, connect.c) вместо оболочки вокруг SSH.
решение4
Вам необходимо эмулировать терминальную сессию:
ssh -t [email protected] "mysql -u blub -p"
В этом случае вам будет предложено ввести пароль, который передается по сети через зашифрованный ssh-канал, и он не будет отображаться в консоли.