Выполните несколько команд ssh в той же оболочке (программно)

Если Вы имеете в виду удаленно, который не ясен из Вашего вопроса. Если Вы не делаете, опустите шаг 2 и 3

  1. Откройте Regedit на рабочей станции Windows
  2. Нажмите File> Connect Network Registry
  3. Введите имя Сервера
  4. Перейдите к серверу HKLM\System\CurrentControlSet\Control\Terminal
  5. Измените значение fDenyTSConnections с 1 до 0
1
задан 19 December 2011 в 07:02
4 ответа

Если вам нужно что-то для захвата вывода, взаимодействия с сеансом оболочки и / или взаимодействия с приложениями pty, такими как screen , вы можете попробовать написать на более высоком уровне библиотека SSH языка, например Net: SSH Ruby. Это требует некоторого обучения, но я считаю, что он сделает все, что вам нужно.

2
ответ дан 3 December 2019 в 17:17

Мне нужно получить доступ к stdout, stderr и коду выхода каждой команды отдельно. Это затрудняет объединение команд в цепочку с помощью && или;.

Я не знаю, действительно ли я рекомендую это, но вы могли бы написать такую ​​функцию оболочки, как эта:

function prefix ()
(
  PREFIX="$1"
  OUT=''
  while read -r ; do
    OUT="${OUT}${PREFIX}${REPLY}"$'\n'
  done
  echo "$OUT"
)

function run_cmd ()
{
  echo "Running command << $@ >> . . ."
  (
    ( ( "$@" ; echo "\$?: $?" >&3 ) | prefix 'STDOUT: ' >&3 ) 2>&1 \
    | prefix 'STDERR: '
  ) 3>&1
}

Тогда if ./ foo.sh bar выводит foo \ nbar \ n в стандартный вывод и baz \ nbip \ n в стандартную ошибку и выходит с кодом 1 , то run_cmd ./foo.sh bar напечатает что-то вроде:

Running command << ./foo.sh bar >> . . .
$?: 0
STDOUT: foo
STDOUT: bar
STDERR: baz
STDERR: bip

Это должно позволить вам связать последовательность команд, при условии, что вы используете run_cmd для всех тех, которые вы нужны STDOUT / STDERR / коды выхода для. (Но поскольку сама команда выполняется в пятиуровневой подоболочке, вы можете ' t используйте run_cmd для запуска любой команды, которая должна установить переменные среды для использования другими командами. Надеюсь, у вас нет команд, которые и выдают выходные и переменные установки?)

2
ответ дан 3 December 2019 в 17:17

Я также считаю, что подход Кайла был бы наиболее многообещающим. Если это не сработает, вы можете написать свой основной скрипт так, чтобы он входил в бесконечный цикл, в котором он ищет командные файлы, которые затем исходят, и делает stdout, stderr и код выхода доступными в форме, пригодной для ваших целей. .

Затем вы должны вставить командные файлы через альтернативный канал, вероятно, просто scp или что-то подобное.

0
ответ дан 3 December 2019 в 17:17

Вы уже смотрели pssh ? Он удовлетворяет большинство ваших требований, и при некотором творчестве и воображении он вполне может вам помочь:

  • Может отправлять команды на несколько серверов одновременно
  • Может выводить в реальном времени
  • stdout и stderr могут быть сохранены в отдельные файлы.
  • сообщает вам, если команда X на сервере Y выполнена успешно или нет
  • может получать ввод от стандартного ввода и отправлять его на серверы
  • имеет настраиваемый тайм-аут

И так далее ...

1
ответ дан 3 December 2019 в 17:17

Теги

Похожие вопросы