Helpers - компьютеры, интернет, программирование

сценарий оболочки для подключения к удаленным машинам по ssh и печати вывода команды top

Я хочу написать сценарий оболочки, чтобы сделать следующие четыре вещи:

  1. ssh удаленная машина (скажем, hosti)
  2. напечатать имя машины в файл (top_out)
  3. напечатать первые несколько строк вывода команды «top» в тот же файл, что и на шаге 2.
  4. повторить 1-3 для другой машины

Я пробовал это:

#! /bin/bash

for i in 1 2 3 4 5 6 7 8

do
    echo "host$i" >> ~/mysh/top_out
    ssh host$i "top -n1 -b | head -n 15>> ~/mysh/top_out"
    echo "done"
done

Выходной файл, который я получил, сохранил верхний вывод для некоторых машин (например, host5-8), но он был пустым для ранних машин, например, host1-4. Если бы я попробовал без строки "echo "host$i" >> ~/mysh/top_out, я бы смог получить верхний вывод для всех хостов 1-8.

06.01.2014

  • лучше всего включить в начало вашего сценария, чтобы «обнулить» файл для каждого запуска (по крайней мере, во время тестирования), то есть echo > ~/mysh/top_out. Удачи. 06.01.2014
  • вам нужно изменить это: ssh host$i "top -n1 -b | head -n 15>> ~/mysh/top_out" на это: ssh host$i "top -n1 -b | head -n 15 " >> ~/mysh/top_out, т.е. >> ~/mysh/top_out должен быть вне кавычек. 06.01.2014
  • должен ли файл ~/mysh/top_out находиться на host1-htos8 или он должен находиться на локальном хосте, откуда выполняется ssh? 06.01.2014
  • Пожалуйста, уточните: на шаге 2. где должен быть расположен файл: напечатайте имя машины в файл (top_out) на удаленном хосте или на моем рабочем столе 06.01.2014
  • Извините, что не указал цель четко. Я хочу сохранить файл (top_out) на локальном хосте. 07.01.2014

Ответы:


1

Когда вы делаете

ssh host$i "top -n1 -b | head -n 15>> ~/mysh/top_out"

вы записываете вывод в ~/mysh/top_out на удаленном хосте, а не на локальном компьютере. Удаленный хост может не использовать тот же физический домашний каталог, что и ваш локальный компьютер. Если у вас есть NFS или что-то еще, совместно использующее ваш домашний каталог на некоторых машинах, но не на всех, вы увидите описанные вами симптомы.

Попробуйте сделать

ssh host$i "top -n1 -b | head -n 15" >> ~/mysh/top_out

вместо этого или сделать вещи немного чище, может быть, даже

#!/bin/bash

for i in $(seq 1 8); do
    (echo "host$i"
     ssh host$i "top -n1 -b | head -n 15") >> ~/mysh/top_out
    echo "done host$i"
done
06.01.2014

2

вы можете попробовать сценарий ожидания, чтобы сохранить вывод каждого хоста после того, как он подключится к нему, вы также можете добавить к нему больше команд, p.s. : это предполагает, что у вас одинаковые имя пользователя и пароль для всех хостов:

#/usr/bin/expect -f

#write your hosts on a new line inside a file and save it in your workging directory as:

#host 1
#host 2
#host 3

#user '' for password if it contains special chars
#pass arguments to the script as ./script $username '$password' $hosttxt
set user [lindex $argv 0]
set pass [lindex $argv 1]
#pass path to txt file with line separated hosts
set fhost [lindex $argv 2]
#set this to the  path where you need to save the output e.g /home/user/output.txt
set wd "/home/$user/log.txt"
#open hosts file for parsing
set fhosts [open $fhost r]
exec clear
#set loguser 1

proc get_top {filename line user pass} {
     spawn ssh -l $user $line
      expect {
          "$ " {}
      "(yes/no)? " {
            send "yes\r"
            expect -re "assword:|assword: "
            send "$pass\r"
      }
     -re "assword:|assword: " {
            send "$pass\r"
      }
     default {
        send_user "Login failed\n"
     exit 1
    }
  }
  expect "$ " {}
  send "top -n1 -b | head -n 15\r"
  expect -re "\r\n(.*)\r(.*)(\\\$ |# )"  {
       set outcome "$expect_out(1,string)\r"
       send "\r"
  }

  puts $filename "$outcome\n\n-------\n"
}


 while {[gets $fhosts line] !=-1} {
       set filename [open $wd "a+"]
       get_top $filename $line $user $pass
       close $filename
 }
06.01.2014

3

Убедитесь, что хосты, для которых вы не получаете вывод, показывают следующую ошибку:

Не задана переменная среды TERM.

Если вы получаете эту ошибку для некоторых хостов, вы можете попробовать следующую команду:

ssh user@host "экран -r; сверху" >> файл_где_вы_хотите_сохранить_выход

06.01.2014
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..