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

Я пытаюсь подключиться к серверу 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' 
  • проблема редактирования utf8 текстовый файл с vim
  • Сервер Git с несколькими репозиториями
  • Запустить скрипт python в `screen` при загрузке?
  • Сценарий манипулирования открытыми ключами SSH в файле authorized_keys
  • Способы оптимизации производительности в трубопроводах по сети (RSH и SSH)
  • Как разрешить прямой доступ root через SSH в определенном диапазоне IP?
  • Соединение OpenVPN на удаленном сервере блокирует все входящие соединения
  • Как переключить пользователя с предварительно настроенными учетными данными в SSH-терминал после входа в систему как стандартный пользователь
  • Новый рабочий стол терминала
  • Настройка перенаправления портов на маршрутизаторе для обратного туннеля SSH
  • как «пересылать» данные отображения x?
  • Interesting Posts

    Может ли звездочка настроить трехсторонний вызов на аналоговой (классической) линии?

    Debian chroot блокирует PTTY на хосте

    Почему несколько консольных консольных консолей доступны / работают одновременно в системах RHEL?

    Объединение реляционных операторов с grep -q в инструкции IF оболочки?

    переместите указанную строку в определенную позицию, используя sed

    mysqld останавливается сразу после запуска из-за поврежденных таблиц (полный диск + перезагрузка оборудования) – как его исправить?

    поиск абсолютного каталога

    Выведите отрицательные значения, независимо от оригинала, на выбранных линиях

    компиляция curl с openssl, дающая неправильную версию openssl

    Top говорит, что используется 100% процессор, но 50% ядер простаивают?

    Как получить семафоры и объекты sharedmem для определенного экземпляра apache, когда несколько экземпляров Apache запускаются с одним и тем же идентификатором приложения в ящике

    Есть ли такая утилита, как dspcat для Linux?

    синтаксис ls -hide = и ls -ignore =

    -m не работает в команде ping

    Как суммировать значения столбцов для каждой строки в двух файлах csv с помощью сценария bash?

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