как выполнять команды на удаленном сервере как разные пользователи

Я пытаюсь подключиться к серверу B с сервера A с помощью ssh и выполнять команды с использованием другого пользователя. Однако, когда я пытаюсь найти шаблон в файле журнала, он говорит: «Невозможно открыть файл журнала» ниже – пример кода

ssh -t user@hostname <<EOF sudo su - someotheruser a=`tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }'` if [ $a -eq 0 ] then echo "Success" else echo "Failure" fi EOF 

как только я запускаю скрипт, он говорит, что unable to open "tail........."

Я не могу оставаться на сервере B и запускать несколько команд.

3 Solutions collect form web for “как выполнять команды на удаленном сервере как разные пользователи”

Подумайте о том, когда выполняется каждая команда, где она выполняется, и какой вход он получает.

  1. Сначала здесь раскрывается документ. Это означает, что канал tail / awk выполняется на локальном хосте и переменная подстановка $a .
  2. Затем выполняется команда ssh . Он получает расширенный здесь документ; это команды, которые выполняются в удаленной оболочке.
  3. Удаленная оболочка выполняется без аргументов, поэтому она считывает команды для выполнения со стандартного ввода. Эти команды включают в себя sudo , но, возможно, (в зависимости от оболочки) некоторые из следующих строк.
  4. Удаленная оболочка выполняет sudo su - someotheruser . Это запускает оболочку как someotheruser которая сначала считывает и выполняет этот файл .profile , а затем считывает команды со своего стандартного ввода. Стандартный ввод содержит все, что не прочитала первая удаленная оболочка, что несколько непредсказуемо (это зависит от оболочки и от того, как это произошло, чтобы прочитать ее входной канал).
  5. Оболочка, запущенная как someotheruser запускает команды, которые она читает, если они есть.
  6. Оболочка, выполняемая как someuser выполняет команду if (если она читается).

Чтобы избежать расширения документа, используйте цитаты вокруг маркера heredoc. Чтобы избежать нечестивой смеси стандартных входов, используйте sh -c … или укажите, что вторая удаленная оболочка получает в качестве своего ввода.

 ssh -t user@hostname <<'SSH_EOF' sudo su - someotheruser <<'SU_EOF' a=`tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }'` if [ "$a" -eq 0 ] then echo "Success" else echo "Failure" fi SU_EOF SSH_EOF 

Вам действительно нужен источник .profile someotheruser ? Если нет, используйте sudo -u someotheruser . Если вы это сделаете, используйте sudo -i -u someotheruser . Правильно управляйте своими судерами.

Чтение файла журнала – единственное, что требует повышенных привилегий, поэтому имеет смысл только запустить команду tail как someotheruser .

 ssh -t user@hostname <<'SSH_EOF' a=`sudo -u someotheruser tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }'` if [ "$a" -eq 0 ] then echo "Success" else echo "Failure" fi SSH_EOF 

Вы упростите свою жизнь, если не будете смешивать методы эскалации привилегий. Вместо того чтобы использовать sudo для перехода от someuser к someotheruser , используйте SSH для localhost. Цепочка двух команд ssh проста. Настройте ключ – вы даже можете настроить ключ, который позволяет запускать определенную команду, например tail -10 /somepath/application.log . Определите псевдоним в вашем .ssh/config для SSH через someuser запись someuser :

 Host hostname-someotheruser HostName hostname UserName someotheruser ProxyCommand ssh someuser@hostname 

Затем запустите

 a=$(ssh hostname-someotheruser tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }') if [ "$a" -eq 0 ] then echo "Success" else echo "Failure" fi 

Если утверждения не являются командами и должны интерпретироваться оболочкой. Вы можете попробовать это. Создание локального скрипта

 a=`tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }'` [ $a -eq 0 ] && echo "Success" || echo "Faiilure" 

и вызвать оболочку bash для выполнения этих команд

 ssh -t user@hostname 'echo "pass" | sudo -Sv && bash -s' < script.sh 

Из того, что вы описали, я думаю, что есть две проблемы. Во-первых, вам это не нужно. Согласно странице руководства ssh , строка, следующая за именем хоста, будет немедленно распознана как команда, выполняемая на удаленном компьютере. Чтобы выполнить несколько команд, вы можете поместить их в одну строку с кавычками. Строка будет отправлена ​​на удаленный и выполнена как скрипт.

 ssh -t user@hostname 'tail -10 /somepath/application.log | awk \'/Agent Exited/ { print $3 }\'; if [ $a -eq 0 ]; then echo "Success"; else echo "Failure"; fi' 
  • Отключить аутентификацию для ssh
  • Добавить открытый ключ на удаленные серверные авторизованные ключи без сохранения файла там
  • Добавление пользователя, который может выполнять только сценарии удаленно
  • Не может ssh в новую установку CentOS минимального на lan
  • «Ssh -L <port>» работает только с локальной машины
  • как вычисляется облако Google сгенерированный ключ SSH для поиска экземпляра VPS?
  • Есть ли способ получить контроль над терминалом с помощью ssh без экрана (дубликат)
  • Ошибка bash: невозможно выполнить двоичный файл
  • Как понять вывод из «ssh -O check» в сценариях bash?
  • Уведомление о том, что удаленный процесс завершен (но не по электронной почте)
  • Экран GNU зависает, пытаясь снова подключиться
  • Interesting Posts

    Как установить другой дистрибутив на Linux-видеорегистратор

    Сохранение результата кошки в виде разных значений индекса

    Почему «Завершение всех оставшихся процессов завершается» при завершении работы?

    Организация электронной почты по дате Использование procmail или maildrop

    Команды, вставленные в bash, не записанные в истории

    Могу ли я переписать обозначения дисков для установщика Qubes?

    Получение ввода с устройства USB, перечисленного в lsusb

    пароль root не работает при входе в однопользовательский режим

    Могу ли я извлечь полную командную строку из файла данных поверх 1.23?

    При удалении пакета Debian, как я могу удалить файлы Python * .pyc?

    Элементы в контекстном меню в Lubuntu

    Непрерывный файл разности

    Как grep две строки из lshw?

    Если я выполнил файл сценария Bash, будут ли выполняться все команды внутри скрипта Bash как sudo?

    Zsh: dirs в обратном порядке

    Linux и Unix - лучшая ОС в мире.