1 Востаннє редагувалося frz (25.08.2022 15:38:04)

Тема: запуск shell команд по черзі

Експериментую із запуском shell команд.

Команди не захардкоджені, наприклад перша команда складається з аліасу і змінної:

shell_alias1 + python_variable1

це виконується (відносно) без проблем:

import subprocess

var_alias1 = "/app/folder1/script1.sh"
variable1 = "abc1"
var_shell_command = ("%s %s" %(var_alias1, variable1))
var_subprocess = subprocess.run(var_shell_command, stdout=subprocess.PIPE, shell=True, executable='/bin/bash')
print(var_subprocess)

Проблема (1) що /app/folder1/script1.sh відображає warning і поки не натиснути будь-яку кнопку на клавіатурі, далі не йде - мабуть треба копати в бік симулювання натискання будь-якої кнопки; (2) поки що незрозуміло, як після вищезгаданої шел команди наказати програмі "спати" 1 секунду і надіслати наступну команду.

----

Upd: читаю в цьому напрямку
https://www.geeksforgeeks.org/piping-in-unix-or-linux/
https://www.geeksforgeeks.org/input-out … -in-linux/

2

Re: запуск shell команд по черзі

Скрипти для автоматизації не мають чекати на взаємодію з людиною. Прогляньте той /app/folder1/script1.sh - може, там є опція, що пригнічує попередження.
Найпростіший спосіб щось відправити у скрипт - це змінити його вхідний потік (stdin) на щось, потрібне вам. Спробуйте.
Спати - це sleep, перепрошую.

3

Re: запуск shell команд по черзі

Скрипти для автоматизації не мають чекати на взаємодію з людиною.

Власне працюю над тим аби цього уникнути.

Прогляньте той /app/folder1/script1.sh - може, там є опція, що пригнічує попередження.

Прикол в тому, що даний скрипт веде себе по-різному якщо запускати його (1) з консолі "як звичайно" і якщо його запускати (2) з коду Python. В (1) скрипт відображає попередження, друкує перелік можливих дій і чекає на внесення інпуту від користувача; в (2) скрипт відображає попередження і висить, хоча наступною командою я йому передаю інпут, далі друкує перелік можливих дій і повідомлення про те що мій інпут некоректний, після чого процес завершується.

Найпростіший спосіб щось відправити у скрипт - це змінити його вхідний потік (stdin) на щось, потрібне вам. Спробуйте.

Якраз про це читаю.

Спати - це sleep, перепрошую.

Знаю, та це ж український форум, тому адаптовую до середовища )))

4

Re: запуск shell команд по черзі

Зверніть увагу на subprocess.Popen

Подякували: dot1

5 Востаннє редагувалося frz (25.08.2022 19:28:47)

Re: запуск shell команд по черзі

Запускаю пайтон код котрий в свою чергу запускає баш скрипт. В баш скрипті серед іншого декларується аліас, що складається з набору комплексних змінних у залежності від вхідних параметрів переданих у баш скрипт.

alias alias1="..." # набір комплексних змінних тут

Після того як запустити баш скрипт в консолі "як звичайно", то аліас успішно працює там само в тій же консолі. А от якщо в пайтон коді запустити баш скрипт і після того в тому ж пайтон коді спробувати використати аліас, тоді отримую помилку:

/bin/bash: alias1: command not found.

Тепер шукаю як це пофіксити...

6

Re: запуск shell команд по черзі

Вибачте, а якого ви вирішили що щось буде з баша імпортуватися в пайтон? Це різні процеси, між ними бігає лише те, що ви прямо вказали. Додайте echo аліаса і читайте його зі stdout.

Подякували: leofun011

7

Re: запуск shell команд по черзі

koala написав:

Додайте echo аліаса і читайте його зі stdout.

Я якраз дійшов до точно тієї ж ідеї, тільки відклав реалізацію на завтра  *THUMBSUP*

8

Re: запуск shell команд по черзі

Задача спростилася з одного боку.
В мене тепер є перелік айпі адрес в базі sqlite3. Я успішно роблю ітерацію і виловлюю за допомогою socket ті хости, в яких закритий потрібний порт (в даному випадку це 22, але потім потрібні будуть інші). За допомогою цієї автоматизації вже не треба руками пробувати тисячу айпішок (а насправді дві тисячі, бо перевірка робиться з декількох місць).
Виловлюється десь близько 50 айпішок і далі треба отримати такий текст вже вручну:

user1@host1:~> ssh 10.11.12.13
ssh: connect to host 10.11.12.13 port 22: Connection timed out

Причина - бо люди кому я це далі передаю не мають досвіду роботи з Python і socket, натомість вони звикли до такого формату як вказано вище. Окрім того, були випадки помилкової тривоги, тому це повинно робитися також в консолі.

Поки що це вже й так величезне полегшення, але думаю також над тим, як автоматизувати ще й цей крок. Тобто потрібно з коду Python викликати команду shell і записувати весь процес (надсилання команди і відповідь) в лог.

Пишу це в якості "щоденника самашедшого", аби згодом повернутися до цього.

9 Востаннє редагувалося frz (15.09.2022 11:44:56)

Re: запуск shell команд по черзі

Також дивлюся до такої цікавої тулзи: python-nmap
Дозволяє ранити перевірку портів для переліку хостів паралельно. Це суттєво зберегло б час, бо зараз ітерація займає більше часу. Окрім того, nmap дозволяє крім самого факту що порт закритий, ще й відобразити інформацію чи хост взагалі онлайн. Під капотом - сама стара-добра відома тулза nmap, тобто пакет просто працює як обгортка.

10 Востаннє редагувалося ReAl (15.09.2022 20:26:04)

Re: запуск shell команд по черзі

Не зовсім зрозумів задачу, але киньте поглядом на

import pexpect

і щось в дусі

    child = pexpect.spawn(command)
    # По потребі
    child.expect([список зразків чого чекаємо від програми з її stdout])
    # робимо що хочемо, в тому числі затримки
    child.sendline('рядок програмі на stdin') # увага, тут CR, LF буде додано від шеф-кухаря безоплатно
    #
    child.sendeof()
    child.wait()

Там ще child.before -- що було до зразка (допоки його дочекалися) і child.after — скільки загріб зразок.

Подякували: leofun011

11

Re: запуск shell команд по черзі

koala написав:

Скрипти для автоматизації не мають чекати на взаємодію з людиною.

Буває що автоматизація підхоплює скрипти, які накодили розробники для себе. Навіщо видумувати нове, якщо є якийсь
./build/configure.sh
який розробники для себе вже вилизали.
А тепер автоматизуємо тестування різних варіантів билда. І автоматизаційний скрипт відповідно взаємодіє з тим «ручним» скриптом.

12 Востаннє редагувалося frz (15.09.2022 23:28:12)

Re: запуск shell команд по черзі

ReAl написав:

Не зовсім зрозумів задачу

Тут задачі щодо програмування як такі не ставляться. Точніше, часом щось точково можуть натякнути типу "перевір тут" або "глянь сюди", але це не означає саме "бери кодь". Набрали чимало людей, а серед них, схоже, лише один вже передпенсійного віку дядько в статусі DB Ops здатний кодити на баші. Він тут типу неформального тімліда, бо його скрипти дозволяють зібрати більше інформації ніж це можуть інші люди вручну. Ось він виловлює різні цікаві речі, пише про це в чаті, решта повинні в ручному режимі щось фіксити.

Я поки що в статусі майже вільного слухача. До кінця не бачу картину, та схоже що підпроект на який мене спочатку взяли, чи то відклався, чи то скасувався, інформації в мене нема, лише шматки від хлопця котрого онбордили разом зі мною і він мав потрапити в іншу тіму цього підпроекту. Для нього вже шукають інший проект, але поки що з цим є труднощі (і те що в нього вагітна дружина - не допоможе, проблеми індіанців вождя не колишуть). А мене, так як маю 10y+ досвіду і можу кодити, вирішили спробувати на іншому підпроекті в цьому напрямку, тому умовно заасайнили до іншої тіми. Часом дають марудні ручні задачки - не для того я сюди прийшов, та й скіли кодингу заіржавіють без вжитку. Тож читаю їхній/наш робочий чат, пробую щось закодити в режимі "краще три дні втратити, а потім за годину долетіти" (с)

Ну і ось тут щось почало виходити:
https://replace.org.ua/post/175994/#p175994

Коли показав результат, то відгук того дядька-башиста був приблизно "о, це те що нам потрібно". Ну я промовчав що це я саме накодив. Нехай що хочуть собі думають. Руцями тисячі хостів перепробувати - це не для мене.

Ну й те що я знайшов - ще не означає що воно тут же й пофікшено, в даному випадку йдеться про різні сторонні тіми які не налаштували файрволи і в результаті в нашої тіми нема доступу до потрібних портів на потрібних хостах. А так як хости потрапили в інвенторі, то це провтик когось з членів нашої команди. Коротше, я зі своєю знахідкою як будяк на стежці де ходять босоніж. Допомагати фіксити ці знахідки мені в моїй тімі щось не поспішають поки; точніше фіксити повинні інші окремі тіми відповідальні за файрволи, але неясно кого саме пінґувати і інформацією поки що не діляться. Тобто наче я й молодець, медалька наче моя, але її не замовлятимуть для мене, бо треба забрати від інших людей шматочки їхніх медальок, в тому числі і від декого з моєї тіми.

Але нема куди подітися вже, буду шукати наступні скарби. Їх в голові багацько... Платять "нормас", чому б не покодити у своє задоволення...

Ось наприклад наступний будячок - з чату зрозуміло, що є проблема з тим що поставили певну тулзу на хости і вона на момент перевірки була заранена, а лише після цієї перевірки хост потрапляє в інвенторі. Однак вибіркова ручна перевірка виявила, що є хости в інвенторі на яких після патчів злітають процеси тулзи і більше не раняться. Патчами займається теж наша тіма, але видно що не було здійснено ретельну перевірку чи не злетіли процеси.

Тобто потрібно парсити таблицю sqlite3 з хостами, логінитися на кожен хост через ssh, якимось чином передавати пароль мого юзера в скрипті, далі переключатися на root (є права sudo) і відповідно знову передавати якось пароль мого юзера, далі перевіряти (1) чи є в наявності файл тулзи - умовно /opt/cool_tool і перевіряти (2) чи серед процесів є запущена ця тулза. І в такому стилі тисяча хостів.

Або ще будячок - в кронтабі є певні записи і наче все повинно ранитися, однак файл який має ранитися не має u+x прав або ж папка з логами має невірні права, відповідно на виході нічого не відбувається.

Ну якось так. А потім буде багато інших, не менш захоплюючих задачок...

import pexpect

буду дивитися, дякую

увага, тут CR, LF буде додано від шеф-кухаря безоплатно

з цим вже знайомий, парсив нещодавно, задоволення на любителя.

13

Re: запуск shell команд по черзі

Зі мною зв'язалися секуріті. Покликали на мітинг без пояснення причин, мало бути троє учасників, один з них не з'явився і мітинг перенесли на понеділок. Поки що незрозуміло, але не виключено що моя діяльність з підключенням до купи хостів за короткий проміжок часу видалася їм підозрілою. Чекаю понеділка...

14

Re: запуск shell команд по черзі

frz написав:
ReAl написав:

увага, тут CR, LF буде додано від шеф-кухаря безоплатно

з цим вже знайомий, парсив нещодавно, задоволення на любителя.

Конкретно у моєму випадкові тут девопси поставили \n від себе, а pexpect додав від себе, і у відповідь на перше запитання скрипта летіла відповідь з числом а потім цей додатковий '\n', який сприймався відповіддю на друге запитання і бралося пропоноване значення за умовчанням.
А для інших умов туди треба було передати інше число. І вони мені "помилка у вашому скрипті".
Не було іншого способу поремонтувати це окрім як самостійно знайти і кинути у розсилку патч (у мене на той репозиторій навіть прав запису не було щоб створити гілку та PR).

15

Re: запуск shell команд по черзі

frz написав:

Зі мною зв'язалися секуріті. Покликали на мітинг без пояснення причин, мало бути троє учасників, один з них не з'явився і мітинг перенесли на понеділок. Поки що незрозуміло, але не виключено що моя діяльність з підключенням до купи хостів за короткий проміжок часу видалася їм підозрілою. Чекаю понеділка...

Мене смикнули якось за те, що у мене бачте щось на компі запускалося з /tmp і то доволі часто.
Довелося створити собі для коротких експериментів $HOME/tmp і чистити самостійно.

Подякували: leofun011

16 Востаннє редагувалося frz (23.09.2022 10:53:09)

Re: запуск shell команд по черзі

Декілька останніх днів мій робочий день виглядає приблизно так:

- логінюся в комп
- підключаюся до впн
- вношу в дві білінг системи свої 8 робочих годин, в одній з них деталізую що саме збираюся робити - моніторинг датацентрів
- логінюся в (1) віртуалку, а з неї - в ще одну (2) віртуалку (вимоги безпеки, яких я не розумію, але варіантів нема)
- підключаюся до віддаленого лінукс хоста через ssh, а далі з нього до ще одного лінукс хоста через ssh (це не вимоги безпеки, але щоб працювало без хоста-посередника, потрібно "2" віртуалку перезавантажувати багато разів, а мені це ліниво)
- запускаю свій python скрипт який виловлює помилки в passwordless з'єднаннях (а решту часу втикаю)

Тут трохи деталізую. Виконую руками sudo su - user1, а вже звідти скрипт виконує почергові з'єднання із приблизно тисячею хостів, при цьому з-під user1 повинно виконуватися з'єднання без пароля, а от якщо це не відбувається, тоді мій python скрипт для такого хоста відображає помилку. Ось цю помилку разом із назвою хоста я публікую в робочий чат, далі копіюю на цей хост публічний ключ і звітую про виправлення помилки, за що отримую свої лайки від колег.

Тільки от таких помилок все менше, вчора наприклад була лише одна, сьогодні можливо не буде жодної. Якщо так, тоді буду дивитися в доку щодо валідації серверів аби зрозуміти яку наступну хитру перевірку можна автоматизувати для всіх хостів в одному скрипті.

- також тричі на тиждень беру участь в мітингах команди, де в основному мовчу або говорю лише на початку під час small talk, бо решту моєї діяльності видно в робочому чаті.

Вважаю що за такі "зусилля" така висока оплата - непогано влаштувався. Але написати python скрипт зайняло трохи часу. Не працюй важко - а працюй розумно ))

На жаль, поки що не знайшов можливості підключатися до UI через API. В документації API є, але чи то не відкрили потрібний порт, чи не активували потрібний модуль - коротко кажучи, не працює. Тож коли знову доведеться виконувати завдання в UI, то це марудна ручна робота.

17 Востаннє редагувалося frz (29.09.2022 14:32:09)

Re: запуск shell команд по черзі

Намагаюся отримати результат команди df -h в змінну, але вдається отримати лише першу стрічку...

import subprocess
xy = ""
process = subprocess.run("/usr/bin/df -h", shell=True, capture_output=True, text=True, check = True)
for line in process.stdout.splitlines():
   xy = xy + " " + str(line)
print(xy)

Хто бачить в чому помилка - підкажіть плз.

18 Востаннє редагувалося dot (29.09.2022 20:19:23)

Re: запуск shell команд по черзі

frz написав:

Намагаюся отримати результат команди df -h в змінну, але вдається отримати лише першу стрічку...

import subprocess
xy = ""
process = subprocess.run("/usr/bin/df -h", shell=True, capture_output=True, text=True, check = True)
for line in process.stdout.splitlines():
   xy = xy + " " + str(line)
print(xy)

Хто бачить в чому помилка - підкажіть плз.

Ne znaju vêštšo vesj vyvôd df -h, štšo maje tablytšnu strukturu, treba peretvorjuvaty v odyn rjadok, ale naj:

#!/usr/bin/env python3

import shlex
import subprocess

command = "df -h"
process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, text=True)
output, error = process.communicate()
print(output)

Onov. Aha, xotšete zberehty zmênnu z rjadkamy, todi ne treba bulo nitšoho mênjaty abo zamêstj problêla treba bulo "\n".

Подякували: leofun011

19 Востаннє редагувалося frz (29.09.2022 20:49:06)

Re: запуск shell команд по черзі

dot написав:
#!/usr/bin/env python3

import shlex
import subprocess

command = "df -h"
process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, text=True)
output, error = process.communicate()
print(output)

Дякую... Будете сміятися, вбив сьогодні пів дня, перепробував багато варіантів... Дякую.

Доповнив фільтрацією результату. Чомусь тут не хоче приймати

command = "df -h | grep sometext"

тому фільтрую так:

var_output2 = '\n'.join(line for line in output.split('\n') if 'sometext' in line)

20 Востаннє редагувалося dot (30.09.2022 02:02:40)

Re: запуск shell команд по черзі

Tak tež možna.

Tut ne xotše spryjmaty, bo | — osoblyvôstj obolonky. Tobto treba dodaty shell=True i zmênyty vvôd. V takomu razê treba zmênyty rjadok na:

process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, text=True)
Abo štše možna bulo zrobyty dva dêstva okremo

Tobto v zahalomu maty jmemo desj tak:

#!/usr/bin/env python3

import shlex
import subprocess

df = "df -h"
grep = "grep something"
process_options = { "stdout": subprocess.PIPE, "text": True }
_df = subprocess.Popen(shlex.split(df), **process_options)
_grep = subprocess.Popen(shlex.split(grep), stdin=_df.stdout, **process_options)
output, error = _grep.communicate()
print(output)
Подякували: leofun011