В bash (и других оболочках) можно вставить результат команды в командную строку, используя что-то вроде $ () и `` (обратные кавычки).
Было бы неплохо, если бы у вас было что-то подобное, кроме ssh-сессий. Итак, вы находитесь в сеансе ssh, и вам нужна некоторая информация с вашего собственного компьютера, и вы хотите поместить ее во внутреннюю командную строку на машине, к которой вы подключены.
Например. скажем, вы хотите получить прямой доступ к консоли mysql. Вы можете использовать такую команду:
ssh user@example.com "mysql -u blub -pmypass"
Это работает, но проблема в том, что вы можете увидеть пароль в командной строке процесса оболочки ssh.
Чтобы решить эту проблему безопасности, мне бы хотелось иметь что-то вроде этого:
ssh user@example.com "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"
который будет выполнять cat passfile
на ssh-клиенте, а не на сервере. Есть что-нибудь подобное? У вас есть какие-нибудь уловки, как это сделать?
ОБНОВЛЕНИЕ: я ценю ответы, относящиеся к моему примеру, но я не приму их, если они не ответят на реальный вопрос. То есть, можно ли общаться с клиентским компьютером ssh из сеанса ssh. (Я знаю, что это может представлять собой возможную проблему безопасности)
Возможные решения:
Попробуйте использовать <.
ssh user@example.com "mysql -u blub -p" <файл
Если первая строка в «файле» - это ваш пароль, он «должен» использовать его для запроса пароля, тогда остальная часть будет использована для части sql.
Если вы просто выполняете sql-файл на удаленном сервере, попробуйте:
ssh user@example.com "mysql -u blub -p <file.sql" <пароль
Вы хотите использовать ожидать для этого. Вероятно, он уже на вашей машине. Это стандартный инструмент для любого вида интерактивной автоматизации командной строки. Это библиотека Tcl, так что вы получите некоторые навыки работы с Tcl бесплатно. Остерегайтесь; это вызывает привыкание.
#!/path/to/expect
spawn ssh user@example.com "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact
Несколько лет назад я изучал основную проблему. Я хотел запустить загрузку 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.
Для этой конкретной проблемы, возможно, вы можете просто ввести пароль в свой ~ / my.cnf файл на сервере?
Для вашей идеи: вы должны использовать экранирование, чтобы это сработало:
ssh dba@db "echo \`ssh sven@192.168.2.10 \"cat echofile\" \`"
Снова отредактируйте: вам понадобится вход без пароля с сервера на клиент, что означает закрытый ключ для вашего клиентского ящика на сервере, который даже менее безопасен, чем my.cnf.
Вам нужно эмулировать терминальную сессию:
ssh -t user@example.com "mysql -u blub -p"
В этом случае вам будет предложено ввести пароль для путешествий по сети через зашифрованный ssh-канал, и он не будет отображаться в консоли.
Сначала вам нужно будет запустить оболочку, что-то вроде
ssh user@exampl.com bash -c 'mysql -u user -p$(cat /root/pass_file)'
Ты используешь ssh
вместо того telnet
но по-прежнему отправлять пароль через команду, чтобы его можно было свободно выполнять на удаленном компьютере в виде открытого текста (отображается на ps
листинг там).
Пожалуйста, прочтите это Статья SecurityFocus о защите MySQL.
Хорошо, я думаю, что могу с некоторой уверенностью сказать, что то, что вы не хотите делать, невозможно в общем случае, для этого есть только обходные пути, которые зависят от реальной проблемы, которую вы хотите решить.
Поразмыслив над этим еще немного, я бы решил "примерную проблему", которую вы указали, просто выполнив перенаправление портов через ssh от клиента на сервер, а затем используя локальный клиент mysql с локальным my.cnf, который на самом деле является Кстати, я всегда работаю с mysql.
Вы можете использовать переменные среды на своем локальном компьютере. Если кто-то на вашем локальном компьютере сможет увидеть ваше окружение, это приведет к уязвимости системы безопасности. и любой на сервере может видеть пароль.
PASSWORD=$(cat pass-file) ssh user@example.com "mysql -u blub -p$PASSWORD"
Я думаю, что при использовании одинарных кавычек значение переменной окружения будет взято с удаленного компьютера. Таким образом, вы можете установить PASSWORD = value в .bashrc на удаленном компьютере. Затем на вашем локальном компьютере запустите ssh user@example.com '. ~ / .bashrc; mysql -u blub -p $ ПАРОЛЬ '
Установите sshpass (yum install)
sshpass -p пароль ssh user@host.com
Если вы не хотите беспокоиться о ключах отпечатков пальцев, добавьте
sshpass -p пароль ssh -o StrictHostKeyChecking = no user@host.com
Вы можете заставить bash интерпретировать параметр как команду и загрузить пароль перед его отправкой по SSH.
MY_PASSWORD=abcde ssh user@example.com `echo mysql -p$MY_PASSWORD`