LINUX.ORG.RU

Сообщения Xintrea

 

Как после chroot вызвать бинарники, находящиеся в основной системе?

Привет, народ.

Загрузился с System Rescue Cd. И нужно мне выполнить команду efibootmgr, и она есть на загруженном CD-Rom диске. Но чтобы она выполнилась, надо через chroot переключиться на каталог /mnt/sda3, куда смонтирована система, установленная на жестком диске.

Проблема в том, что в этой операционке нет efibootmgr. И после переключения через chroot, утилита efibootmgr становится недоступной.

Вопрос: есть ли возможность после chroot вызывать утилиты, находящиеся в основной загруженной системе?

 ,

Xintrea
()

Пятница. Давайте заставим работать osci-render и james.ball.sh/oscilloscope в Linux

Есть такой проект:

https://github.com/jameshball/osci-render

Это генератор звуковых стерео-сигналов, которые будучи поданные на осциллограф, рисуют разные картинки. В проект входят, как минимум, две программы:

1. osci-render - программа на Java, имеющая крутилки-вертелки и подгрузку векторных картинок. В реальном времени должна гудеть в динамик в зависимости от картинки для осцилографа, которую она расчитывает. При старте поднимает локальный порт 42988. Предполагается, что к нему может подключиться программный осциллограф чтобы визуализировать картинку.

2. https://james.ball.sh/oscilloscope - программный осциллограф, работающий в браузере. Для отображания картинки использует Canvas. При старте подключается к веб-сокету ws://127.0.0.1:42988, созданному osci-render. Должен показывать картинку, генерирующуюся osci-render-ом.

Проблема в том, что хоть проект и кроссплатформенный, разработчик практически не проверяет работу в Linux. Поэтому ничего не работает.

Во-первых, криво стартует сама программа osci-render. Чтобы увидеть рабочий интерфейс osci-render, надо поизвращаться с jackd, иначе интерфейс зависает. Но это кое-как решаемая проблема.

Проблема номер два: сама связка osci-render и james.ball.sh/oscilloscope не работает. И вот это уже проблема, которую я не могу решить. Я посмотрел netstat - порт 42988 создается. Я посмотрел wireshark - обмен между программным осциллографом и osci-render идет. Но этот осциллограф ничего не показывает, только точку в центре экрана.

Вот эту проблему и надо решить.

Подробности настройки здесь: https://webhamster.ru/mytetrashare/index/mtb0/16907522569aygrnabey

 , , , ,

Xintrea
()

А ну-кось, лорчане, соколики мои! Навалитесь же ЛОР-эффектом на мой сайт чтоб проверить его устойчивость!

Привет, народ

Восстановил наконец я работу своего супер-сайта webhamster.ru, каковой существует ужо без малого 16 лет.

Полтора месяца назад сайт был удален на хостинге без возможности восстановления виртуалки. После этого факапа у меня все небыло времени восстановиться, ну и вот наконец добрался я до консоли и раскатал сайт заново. Для такого дела я даже написал Ansible-плейбуки, на всякий случай. Теперь если придется заново разворачивать из бекапа, все действия будут происходить автоматически, и не нужно будет вспоминать что где надо докрутить чтобы нормально настроить (всего, кстати, чтобы раскатать сайт, нужно выполнить около ~150 действий, и ничего не забыть).

В общем, у меня просьба: перейти на сайт https://webhamster.ru и прощелкать пару-тройку страниц. Нет, скрипты писать не надо (да кто ж вас остановит), пусть нагрузка будет естественная.

Посмотрим, выдержит ли этот инстанс поток пользователей с ЛОР-а.

 , лор-эффект, ,

Xintrea
()

Где прописать остановку сервиса snapd при старте системы?

Имеется сервер Debian Linux 11.

Для работы certbot от Letsencrypt на сервере установлен snapd, так как это единственный официальный способ установки бота сертификатов. Но этот snapd нужен только раз в месяц, когда срабатывает скрипт проверки и обновления SSL сертификатов. В остальное время snapd только жрет память и ресурсы процессора.

В скрипте запуска certbot прописаны команды включения сервисов snapd и snapd.socket перед запуском утилиты, и команды выключения этих сервисов после того как утилита certbot закончит работать.

То есть, snapd в обычном состоянии всегда должен быть потушен.

Чтобы snapd не стартовал при запуске, я дал команды:

systemctl disable snapd
systemctl disable snapd.socket
И перегрузился.

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

Я не понимаю, зачем тогда нужен systemctl, если он все равно ничем не управляет? Как оставить snapd в системе, но не давать ему включаться при старте? Что где еще надо докручивать?



Перемещено hobbit из general

 , , , ,

Xintrea
()

Как настроить отправку писем по SMTP через mail.google.com в 2023 году?

Сейчас восстанавливаю работу своего сайта, и занялся вопросом отправки писем.

Год назад все работало согласно данной инструкции:
https://webhamster.ru/site/page/index/articles/comp/149

Но теперь ssmtp показывает ошибку:

sendmail: Authorization failed (535 5.7.8  https://support.google.com/mail/?p=BadCredentials v6-20020a2e9246000000b001b6e... - gsmtp)

Я начал разбираться, и узнаю, что:

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

https://support.google.com/accounts/answer/6010255?hl=ru


В то же время, официальная документация Google говорит, что можно включить работу с «ненадежными приложениями». И я даже нашел прямой линк на эту настройку: https://myaccount.google.com/lesssecureapps

Однако на этой странице написано следующее:

Ненадежные приложения, у которых есть доступ к аккаунту
Эта настройка недоступна в вашем аккаунте.


Я читаю почему это мне настройка недоступна, и написано, что эта настройка доступна только для тех аккаунтов, на которых не включена двухфакторная аутентификация. Но дело в том, что она у меня и не включена:

Google аккаунт - Безопасность - Вход в Google - Двухэтапная аутентификация - Двухэтапная аутентификация отключена.


Все, на этих взаимоисключающих параграфах я запутался окончательно. Что еще нужно Гуглу? В каких местах что еще надо крутить чтобы отправка почты по SMTP заработала?

 , , ,

Xintrea
()

Добавление секции non-free в APT через Ansible - почему удаляются строки?

Имеется исходный файл /etc/apt/sources.list :

deb http://ftp.ru.debian.org/debian bullseye main contrib
deb-src http://ftp.ru.debian.org/debian bullseye main contrib

deb http://security.debian.org/debian-security bullseye-security main contrib
deb-src http://security.debian.org/debian-security bullseye-security main contrib
И надо в него добавить секцию non-free.

Придумал такой код:
   - name: "Добавление секции non-free в APT"                                                                              
     replace:                                                                                                              
       dest: /etc/apt/sources.list                                                                                         
       regexp: '(deb|deb-src)\s*(http://.*debian.*)\s*(.?)\s*main contrib\s.*(?!non-free)'                                 
       replace: '\1 \2 \3 main contrib non-free'
В результате в файле, за каким-то хреном, исчезают строки deb-src:
deb http://ftp.ru.debian.org/debian bullseye   main contrib non-free

deb http://security.debian.org/debian-security bullseye-security   main contrib non-free

Почему так то? Какое правильное регулярное выражение должно быть?

 , , ,

Xintrea
()

Почему в Ansible команда «pkill -f nginx || true» возвращает ненуливой код ошибки?

Столкнулся с очередной загадкой.

Если на целевом хосте в SSH-консоли выполнить команду:

pkill -f nginx || true

То она успешно выполняется, код ошибки, видимый через команду echo $?, всегда нуливой.

Если ту же команду сделать через Ansible:
   - name: "Остановка сервиса Nginx - дополнительный метод"                                                                
     shell: "pkill -f nginx || true"

Тогда эта команда всегда заканчивается ненулевым кодом возврата:
fatal: [siteHost]: FAILED! => {
"changed": true, 
"cmd": "pkill -f nginx || true", 
"delta": "0:00:00.009630", 
"end": "2023-07-01 15:35:48.555054", 
"msg": "non-zero return code", 
"rc": -15, 
"start": "2023-07-01 15:35:48.545424", 
"stderr": "", 
"stderr_lines": [], 
"stdout": "", 
"stdout_lines": []}


Чтобы «съэмулировать» поведение Ansible, я в SSH-консоли удаленного хоста стал выполнять команды:
# bash -c "pkill -f nginx" 
# echo $?
1

# bash -c "exec pkill -f nginx" 
# echo $?
1

# bash -c "pkill -f nginx ; true" 
Terminated
# echo $?
143

# bash -c "pkill -f nginx || true" 
Terminated
# echo $?
143

Похоже, действительно у pkill есть какие-то особенности, которые влияют на код возврата. Но непонятно почему вызов true этот код не подавляет.

В общем, я не пойму как составить команду, которая будет завершаться нуливым кодом возврата в комбинации с pkill.

 , , error code, pkill, код возврата

Xintrea
()

А кто-нибудь замечал, что ChatGPT ест процессор в Chromium?

Постоянно наблюдаю одно и тоже.

Открываю chat.openai.com в браузере Chromium. Примерно 20 минут работа идет нормально. Ну бывает, не генерируются ответы, но нажмешь регенерейт, и ответ будет. Работа неспешная, задаю 5-10 вопросов за 20 минут.

Но спустя ~20 минут все внешне продолжает работать нормально. За исключением того, что вкладка браузера с ChatGPT начинает отжирать процессорное время. Около 20% на Intel Core i3-10100 CPU 3.60GHz. Если закрыть вкладку (даже не браузер), выжирание останавливается.

Такое впечатление, что ChatGPT настолько умна, что в тихую майнит крипту в браузерах пользователей.

Что с этим вашим ChatGPT происходит?

 , ,

Xintrea
()

Как найти DOS-овый файл kpss.com в этих ваших интернетах?

В 90-х годах по дискетам блуждал файл, который назывался kpss.com.

Это была программа, которая хорошо поставленным голосом с помощью частотной модуляции говорила в PC-спикер фразу: «К борьбе за дело коммунистической партии Советского Союза будьте готовы!».

Сейчас безуспешно путался ее найти, и не смог. Поиск в яндексе-гугле-утке ничего не находит. На OldGames и DosGames тоже ничего нет.

https://www.old-games.ru/catalog/?gamename=kpss
https://dosgames.ru/search/simplesearch/?input=kpss

Объявляется интернет-розык данного файла.

 , , , , чм

Xintrea
()

Поместил go.sh в /etc/profile.d, а он срабатывает только для root, а не для пользователей. Почему?

Очередные загадки линукса.

Имеется Debian 11 Stable. В каталог /etc/profile.d добавлен файл go.sh, следующего содержания:

export PATH=/usr/local/go/bin:${PATH}

Права у него такие же как и у других файлов:
# ls -la
итого 44
drwxr-xr-x   2 root root  4096 июн  5 09:33 .
drwxr-xr-x 144 root root 12288 июн  6 08:31 ..
-rw-r--r--   1 root root   726 авг 12  2020 bash_completion.sh
-rw-r--r--   1 root root   831 янв 18  2022 flatpak.sh
-rw-r--r--   1 root root  1107 фев 10  2021 gawk.csh
-rw-r--r--   1 root root   757 фев 10  2021 gawk.sh
-rw-r--r--   1 root root    38 июн  5 09:35 go.sh
-rw-r--r--   1 root root  1384 фев 18  2021 vte-2.91.sh
-rw-r--r--   1 root root   966 фев 18  2021 vte.csh

По идее, это глобальный профиль, и команды во всех этих файлах должны выполняться для всех пользователей. Тем более что в файле /etc/profile я вижу:
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Однако по-факту оказывается, что путь к Go устанавливается только для пользователя root. А у простых пользователей скрипт go.sh почему-то не срабатывает, и в PATH нет пути до директории Go.

Почему так? Как заставить работать скрипт в каталоге /etc/profile.d для каждого пользователя а не только для суперпользователя?

 , , ,

Xintrea
()

С обеда отрубился play.google.com - Приложение Сервисы Google Play остановлено

Привет, народ.

Уже второй час старенький планшет Samsung Galaxy 4 начал чудить. Смотрел ютубчик (другого на планшете в общем то и не делаю, ничего не настраивал), и вдруг: постоянно, каждые несколько секунд показывается окно с сообщением: «Приложение Сервисы Google Play остановлено». Раз десять перегрузился, толку никакого - долбанное nag-окно постоянно появляется.

Стал разбираться, и обнаружил, что из моей домашней сетки недоступен play.google.com. Даже с браузера компьютера сайт play.google.com не открывается: «Время ожидания ответа от сервера play.google.com истекло».

А через VPN в компьютерном браузере play.google.com открывается.

Патыюсь пингануть с компьютера напрямую:

>ping play.google.com
PING play.google.com (142.251.1.113) 56(84) bytes of data.
64 bytes from lb-in-f113.1e100.net (142.251.1.113): icmp_seq=1 ttl=108 time=18.9 ms
64 bytes from lb-in-f113.1e100.net (142.251.1.113): icmp_seq=2 ttl=108 time=18.9 ms
64 bytes from lb-in-f113.1e100.net (142.251.1.113): icmp_seq=3 ttl=108 time=18.6 ms

Про этот странный хост написано следующее:

1e100.net is a Google-owned domain name used to identify the servers in our network.

Following standard industry practice, we make sure each IP address has a corresponding hostname. In October 2009, we started using a single domain name to identify our servers across all Google products, rather than use different product domains such as youtube.com, blogger.com, and google.com. We did this for two reasons: first, to keep things simpler, and second, to proactively improve security by protecting against potential threats such as cross-site scripting attacks.

Most typical Internet users will never see 1e100.net, but we picked a Googley name for it just in case (1e100 is scientific notation for 1 googol).


То есть, это официальный хост Гугла, он должен куда-то перенаправлять. И перенаправляет, если заходить с VPN. Так что я не пойму, должен ли быть доступен play.google.com для работы Android или нет. У жены через домашнюю сетку тоже браузеры зайти не могут, но само приложение Google Play работает и ставит программы.

В общем, из-за этого nag-окна планшетом пользоваться невозможно. Прочитал, что надо сбросить настройки или обновления «Сервис Google Play» и «Google Play». Сбрасывал, отменял обновления, толку никакого, даже удалил «Google Play», тоже толку никакого, nag-окно каждые три секунды появляется. Браузер Chrome тупит и вылетает, не открыв ни одной страницы. Поэтому не могу зайти на play.google.com чтобы установить «Google Play».

Кстати, планшет не рутован, я вообще не понимаю как так «Google Play» удалилось, вроде оно относится к системным, и Android не должен был позволить его удалять.

Что это за хрень такая, как восстановить работу системы?



Перемещено leave из general

 , , ,

Xintrea
()

Как собрать нестандартные факты со всех хостов в одну переменную?

Мне нужно сделать очень необычную вещь.

Необходимо сделать такой плейбук, который получит версию нестандартного Linux-дистрибутива из специализированного файла на каждом хосте. Чтобы узнать версию дистрибутива, в bash можно давать команду cat /etc/dist_version.

Плейбук должен проверить, совпадают ли версии на всех хостах. Если на всех хостах версии одинаковые, плейбук должен успешно завершиться. Если хоть одна версия не совпадает, плейбук должен завершиться ошибкой (через модуль fail).

Другими словами, в начале выполнения плейбука неизвестно, какие версии будут на хостах, и невозможно заранее сказать, с какой версией нужно сравнивать.

Результат высчитывается так:

host1 - v.1.25
host2 - v.1.25
host3 - v.1.25
True

host1 - v.1.29
host2 - v.1.29
host3 - v.1.29
True

host1 - v.1.29
host2 - v.1.25
host3 - v.1.29
False

host1 - v.1.25
host2 - v.1.29
host3 - v.1.25
False

Таким образом, надо каким-то макаром собрать нестандартный факт со всех хостов в одну переменную-список, ну а потом ее проверить, чтобы все элементы были одинаковыми.

Я не могу сообразить, как это можно сделать в Ansible?

 , накопительная, , факт

Xintrea
()

Чем занять школьника 10-11 класса в отделе разработки ПО?

По программе «Трудовое лето» в отдел необходимо принять на месяц школьника. И загрузить его какой-то посильной работой. Отдел занимается разработкой ПО под Linux на C++/Qt, есть немного Питончика но очень специфического. Интернета на рабочем месте, естественно, нет.

Умения школьника: устанавливать паленую Windows и MS Офис, ставить Steam и рубаться в игры. Есть знания Blender 3D, сам разобрался в базовых инструментах Компас 3D, делал сборки в нем на ~20 деталей. Моделит бытовые предметы, корпуса, игрушки-финтифлюшки для печати на 3D принтере (предпочитает Blender). Немного умеет паять, кое-как может проследить откуда куда идет проводок на графической схеме и сопоставить где этот проводок должен быть в реальности. То, что для питания электроприборов постоянного тока используется два провода, подключаемых к потенциалу и земле - было открытием. Работа переменного тока - за гранью понимания. В школе проходил Pascal, но желания погружаться в программирование нет, потому что ведь есть веселые игры, а это гораздо интереснее. Word - наивная безстилевая верстка, начальные знания Excel.

Теперь надо придумать, чем этого человека можно на месяц занять.

Ваши предложения?

 , ,

Xintrea
()

Как правильно перевести «guitar case»? Это корпус гитары или чехол для гитары?

В следующем тексте используется словосочетание «guitar case». Как правильно его перевести?

I am a singer/songwriter and was looking for a travel guitar since my Vintage Martin Backpacker guitar has a raised bridge and a crack in the wood from age and temperature changes making it increasing difficult to comfortably play.

So when I watched nearly every single review video on youtube about the guitar, I felt confident that this guitar would be an ideal choice for my intended purposes. Unfortunately out of all the ‘sponsored in one way or another Nova Go endorsements’ that I watched, not one reviewer mentioned the odor that is emitted from the guitar case from the petrochemicals it is made from!

So I am primarily motivated to share this review because even though I watched over several dozen it is incredulous to me that no one mentioned even in passing the stench of this guitar case which actually permeates the guitar itself.

This was highly disappointing because I bought this combo in a large part because of the form fitting guitar case which would easily fit in my car when traveling. Yet, there is no way I can put this case in my car without the odor which smells like over heated car tires when you brake too much going down hill permeating my entire car.

I tried airing out the case for days and the smell hasn’t dissipated which is disheartening because I really like the guitar yet didn’t want to fork over more money to buy a case that wouldn’t be as form fitting as the petroleum based case it came with. I also would need to replace the guitar strap because it’s made from the same awful smelling material. In the past, I purchased a keyboard case made from the same pungent stuff and the scent never went away so I doubt that this case will be any different.

For me the odor issue is frustrating and an inconvenience to have to buy a different case yet for someone with chemical sensitivities the substance this case is comprised of could really jeopardize someones health by causing an allergic reaction to the petrochemicals.

I’m not recommending not buying this combo because the guitar is ideal for travel if you don’t want to ruin your wood guitar by moisture, heat or cold. Nice for taking to the beach and camping. Just don’t think for a minute you could hike with it because it is heavy for it’s size where you will also experience neck dive so you do need to play it while using a strap.

If you want a guitar to backpack with, the Martin Backpacker guitar ($299.00 with exceptional fabric case that doesn’t off gas) is truly the only sized guitar for the task. Yet the Nova Go’s sound is much better than the Martin so save yourself some money by buying the Nova as long as you factor in the cost of a different guitar case which may or may not make the Nova Go a financially feasible purchase for you.

When I expressed my disappointment with the Nova Go case with Enya, I dealt with August a stellar representative who is a credit to their company. And I was impressed with both her and Enya’s responsiveness to my concerns which were resolved in such a way that I decided to keep the guitar even though I will be out of pocket for buying a different case and strap to complete the original combo.

The way they quickly, consistently and compassionately responded to me over multiple interactions engendered a trust in their company which I don’t experience much on Amazon. So much so that I am considering upgrading to their Nova Go Smart Guitar when it debuts on Amazon especially if they include a different non-off gassing case with it.

For what appears to me to be a customer oriented based company, I would hope that in the future Enya would supply a different case with their guitar combos that doesn’t off gas toxic petrochemicals which not only make it intolerable to smell yet could present a serious health concern to the many individuals who suffer from chemical sensitivities. Perhaps an inexpensively produced case like the many foam ones found on amazon could be an alternative to their petroleum based case. I surely hope they will seriously change the case material because I would like to become a lifelong customer in both buying and recommending their products.

 , ,

Xintrea
()

Как понять, какая программа (сервис) пытается законнектиться на сервер?

На Linux-сервере видны непрекращающиеся попытки хоста 192.168.1.95 соединиться на портах 57770 ... 57776, где-то в этом диапазоне.

На самом хосте тоже видны эти подключения, но непонятно кто их создает:

> netstat -np
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.1.95:57770      192.168.1.251:22        TIME_WAIT   -
tcp        0      0 192.168.1.95:47942      192.168.1.251:389       ESTABLISHED -
tcp        0      0 192.168.1.95:57776      192.168.1.251:22        TIME_WAIT   -
tcp        0      0 192.168.1.95:43086      192.168.1.251:5222      ESTABLISHED 2465/psi-plus
tcp        0      0 192.168.1.95:49960      192.168.1.251:389       TIME_WAIT   -
tcp        0      0 192.168.1.95:49958      192.168.1.251:389       TIME_WAIT   -
tcp        0      0 192.168.1.95:49456      192.168.1.251:749       ESTABLISHED -


Как можно выяснить, какая часть системы за это ответственна?

Дистрибутив Astra Linux (Debian 9).

 , , , ,

Xintrea
()

Как сгенерировать заданный код выхода (exit code) одной командой?

Мне нужно выполнить такую команду, которая бы возвратила заданный код возврата. Код возврата принимается из входного потока.

Пытаюсь сделать так:

> echo 32 | xargs exit
xargs: exit: Нет такого файла или каталога
Неожиданный сюрприз. Какого-то черта xargs не работает со встроенными командами шелла...

Как по-другому можно решить эту задачу?

Может быть, даже через inline perl / python или еще каким командным извратом.


Перемещено hobbit из general

 , exit code, код ошибки

Xintrea
()

Можно ли перенаправить стандартный поток одновременно в несколько приемников?

Я читаю статьи про потоки в Linux, и не могу взять в толк: а имеется ли возможность перенаправить поток так, чтобы он попадал не в один приемник, а сразу в несколько? Например, направить какой-нибудь /dev/pts/15 в /dev/ttyS3 и одновременно в файл и одновременно в /dev/pts/32?

Все примеры в статьях крутятся вокруг того, что поток перенаправляется только в один приемник, и все.

Может быть есть какой-то специальный приемник, или стандартная утилита, через которые поток можно «разветвить»? Вроде как имеется утилита tee, но похоже, что она работает только через «|» (stdout левой в stdin правой команды), причем непонятно что она будет делать если у выполняемой команды перенаправлены потоки через «<» и «>».

Если что, вопрос возник вот в этом обсуждении: Xterm в Tk. Почему не каждый цветной терминальный вывод отображается через Popen+communicate? (комментарий)

 , , , ,

Xintrea
()

Xterm в Tk. Почему не каждый цветной терминальный вывод отображается через Popen+communicate?

Имеется процесс xterm, который «вставлен» в Tk-окно:

class Terminal(tk.Frame):

    def __init__(self, parent):
        ...
        # Получение tty с которым будет работать терминал (грубый хак)
        os.system('xterm -into %d -geometry 160x50 -sb -e "tty > /tmp/ttyinfo.txt"' % self.wid)
        fp=open('/tmp/ttyinfo.txt', 'r')
        self.tty=fp.readline().strip();
        fp.close();
        print("tty info: "+self.tty)

        # Открытие терминала с bash. Перед запуском bash выводится рабочий tty
        os.system('xterm -into '+str(self.wid)+' -geometry 160x50 -sb -e "tty ; bash -norc" &')

Выполнение команд в этом xterm-терминале сделано двумя способами:

  • Через os.system().
  • Через Popen+communicate.


Для теста я использую две команды, которые генерируют цветной вывод:

1: ip -color addr
2: ansible-playbook ourPlaybook.yml
И вот какая проблема проявилась:

  • Способ запуска через os.system() всегда работает правильно. Для обеих команд вывод в xterm цветной.
  • Способ запуска через Popen+communicate() правильно работает только для «ip -color addr». Но для Ansible почему-то генерируется монохромный вывод.


А нужно чтобы и через Popen+communicate() правильно генерировался цветной вывод в терминал для любой команды. Потому что только этим способом можно получить stdOut + stdErr + errCode. Ведь в os.system доступен только код возврата.

Для демонстрации я сделал минимальный пример. Функции запуска выглядят так:

    # Выполнение команды в терминале - вариант 1
    def doCommand1(self, text) :
        cmdLine="(%s) <%s >%s 2> %s" % (text, self.tty, self.tty, self.tty)
        result=os.system(cmdLine)
        ...
        return result

    # Выполнение команды в терминале - вариант 2
    def doCommand2(self, text) :
        cmdLine="%s" % (text)
        resultTriada=command.run(cmdLine)
        log.echo("* Результат: "   +resultTriada[0])
        log.echo("* Вывод ошибок: "+resultTriada[1])
        log.echo("* Код возврата: "+str(resultTriada[2]))
        ...
        # Возвращается кортеж из stdOut, stdErr, errCode
        return resultTriada

Во втором случае используется метод с вызовом Popen+communicate():
class Command():

  # Запуск внешней программы
  def run(self, cmd):
    p=Popen(cmd, stdout=PIPE, shell=True)
    stdOutData, stdErrData = p.communicate()
    errCode=p.returncode

    outData=""
    errData=""

    if not stdOutData is None :
      outData=stdOutData.decode()

    if not stdErrData is None :
      errData=stdErrData.decode()

    # Убирается последний перенос строк, чтобы в конце небыло пустой строки
    outData=re.sub("\n$", '', outData)
    errData=re.sub("\n$", '', errData)

    return(outData, errData, errCode)

В примере сделано 4 кнопки (то есть, со всеми возможными вариантами):

- IP адрес (os.system)
- IP адрес (Popen)
- Ansible (os.system)
- Ansible (Popen)

Первые три генерируют цветной вывод, а четвертая - монохромный.

Так вот, надо добиться, чтобы и вариант на 4-й кнопке, обязательно делал цветной вывод.

Ссылка на пример: https://files.fm/u/ex9nfywf2

Скриншот: https://i.ibb.co/FKZQYkt/screenshot-2023-04-25-15-45-51.png
(На нем видна часть цветного вывода 3-й кнопки, и монохромный вывод 4-й кнопки).

 , , , ,

Xintrea
()

Как в os.system() экранировать специальные символы? Не могу написать bash-промпт PS1

Мне нужно вызвать окно xterm с запущенным bash так, чтобы в нем было специальное приглашение ввода (оно же prompt).

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

xterm -geometry 160x50 -sb -e "tty ; export PS1=\"\\u-\\h:\\W\\> \" ; bash -norc"

И нужно эту команду запустить из Python-скрипта, через os.system(). Я пробую сделать так:
#!/usr/bin/python3
import os
os.system('xterm -geometry 160x50 -sb -e "tty ; export PS1=\"\\u-\\h:\\W\\> \" ; bash -norc"')

Однако в этом случае xterm стартует с ошибкой:
xterm: Can't execvp tty ; export PS1=u-h:W>: Нет такого файла или каталога

И промпт, естественно, остается не настроенным.

Вопрос: как правильно засунуть все нужные символы в строку, которая будет выполнена через os.system() ?

Я пробовал и двойное экранирование, и даже через chr(0x5C) передавал обратный слеш во всяких разных комбинациях, нащупать правильную строку так и не смог.

 , , , ,

Xintrea
()

Теряется ввод терминала, как можно исправить?

Имеется два скрипта.

Первый terminal.py - скрипт на Python3 и Tkinter. В нем создается окошко xterm, а под ним поле ввода команды и кнопка исполнения.

Второй input.sh - это демонстрационный bash-скрипт с командой read, чтобы продемонстрировать проблему.


Итак, запускается terminal.py. В области xterm можно напрямую вводить команды, и они исполняются. И если в нем запустить ./input.sh, то ввод работает без проблем, скрипт выполняется как положено.

Если же запустить команду ./input.sh в нижнем поле ввода окошка terminal.py и отправить ее на исполнение (все потоки 0, 1, 2 будут направлены в tty, где запущен xterm), то ввод read будет «проглатывать» символы. Хорошо если появится 1 из 10. И кнопку Enter в конце ввода сложно нажать. А если она все-таки нажмется, то окажется, что происходил не ввод текстовых данных через read, а происходил ввод bash-команды, которая, естественно, не выполнится и будет ошибка:

sh: 234: команда не найдена

В общем, не могу разобраться, можно ли что-нибудь в этой ситуации сделать, чтобы ввод read не терялся и работал правильно.

Сами скрипты даны ниже:

terminal.py
#!/usr/bin/python3

from tkinter import *
import os
import re

ttyDevice=""


def escapeString(s) :
    result = re.sub(r'([ \"\'\|\<\>])', r'\\\1', s)
    return result

def send_entry_to_terminal(*args) :
    # Параметр *args необходим из-за того, что данная функция
    # может быть вызвана без параметра (из кнопки)
    # или с одним параметром (из поля ввода)

    tty=ttyDevice
    print('tty: '+tty)

    command=commandEntry.get()
    print('Command: '+command)

    # Вывод в терминал строки команды, которая будет выполняться
    cmdLine="echo %s <%s >%s 2> %s" % (escapeString(command), tty, tty, tty)
    print('Echo line:')
    print(cmdLine)
    os.system(cmdLine)

    # Выполнение команды в терминале
    cmdLine="(%s) <%s >%s 2> %s" % (command, tty, tty, tty)
    print('Command line:')
    print(cmdLine)
    os.system(cmdLine)


root = Tk()

# Место для вставки терминала
termFrame = Frame(root, height=700, width=1000)
termFrame.pack(fill=BOTH, expand=YES)
wid = termFrame.winfo_id()
print("Terminal window id: "+str(wid))

# Панель для ввода отправляемой команды
panelFrame=Frame(root)

Label(panelFrame, text="Command:").pack(side=LEFT)
commandEntry = Entry(panelFrame)
commandEntry.insert(0, "ls -l")
commandEntry.pack(side=LEFT,fill=X,expand=1)
commandEntry.bind("<Return>", send_entry_to_terminal)

buttonSend = Button(panelFrame, text="Send", command=send_entry_to_terminal)
buttonSend.pack(side=LEFT)

panelFrame.pack(fill=X, expand=1)

# Получение tty с которым будет работать терминал
os.system('xterm -into %d -geometry 160x50 -sb -e "tty > /tmp/pyguitty.txt"' % wid)
fp=open('/tmp/pyguitty.txt', 'r')
ttyDevice=fp.readline().strip();
fp.close();
print("tty info: "+ttyDevice)

# Открытие терминала с шеллом. Перед запуском шелла выводится рабочий tty
os.system('xterm -into %d -geometry 160x50 -sb -e "tty; sh" &' % wid)

root.mainloop()


input.sh
#!/bin/bash

echo "Укажите третий октет IPv4 адреса:"
read -p "> " subNet
echo "Вы ввели $subNet"

echo "Задержка 3 секунды..."
sleep 3

echo "Скрипт завершен"

 , , , ,

Xintrea
()

RSS подписка на новые темы