LINUX.ORG.RU

Сообщения Xintrea

 

Как запустить скрипт через at от non-root пользователя?

 , , ,

У меня есть два простых скрипта:

/opt/script/loloswitcher.sh

#!/bin/bash

echo "/opt/script/loloswitcherPostRun.sh" | at now

/opt/script/loloswitcherPostRun.sh
#!/bin/bash

logFile="/tmp/loloswitcherLog.txt"

/bin/date > $logFile
/bin/echo "Label 1" >> $logFile


/bin/sleep 3


/bin/date >> $logFile
/bin/echo "Label 2" >> $logFile

Права на эти скрипты следующие:
$ ls -la | grep lolo 
-rwxrwxrwx  1 root root  391 мар  2 10:47 loloswitcherPostRun.sh 
-rwxrwxrwx  1 root root  204 мар  2 10:24 loloswitcher.sh

Проблема в том, что если запустить loloswitcher.sh от root, то произойдет запуск loloswitcherPostRun.sh, будет создан файл /tmp/loloswitcherLog.txt, в него будут записаны обе метки Label 1 и Label 2.

Но если удалить /tmp/loloswitcherLog.txt и запустить loloswitcher.sh от обычного пользователя, то скрипт loloswitcherPostRun.sh не будет выполнен, и файл /tmp/loloswitcherLog.txt вообще не будет создан. В системных логах полное молчание, никаких ошибок или предупреждений.

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

Xintrea
()

Как выкачать определенный pack-файл с Git-репозитария?

 , gitfs,

Сижу сейчас на мобильном интернете.

У меня в локальной копии репозитария оказался поломанный pack-файл. Я бы мог перевыкачать весь репозитарий, но размер репозитария несколько гигабайт.

Я знаю точно название pack-файла, и мне надо выкачать только его:

.git/objects/pack/pack-dd181d6ed4ebbcf10347fb0908a2f644ef40b993.pack

Вопрос: как это сделать? Репозитарий на Гитхабе.

Xintrea
()

Как вставить значение переменной в одинарные кавычки?

 , , ,

В bash есть особенность: внутри одинарных кавычек значение переменной не разворачивается:

networkByte="205"

result1=`echo $networkByte`
result2=`echo '$networkByte'`

echo $result1
echo $result2

Выхлоп:
205
$networkByte

В связи с этим вопрос: а как тогда подставлять значения переменных в grep/sed? Вот есть такая команда:
projectType=`cat ./config.xml | \
 grep '^\s*<\s*App\s*name.*project.*network\s*=\s*\"$networkByte\".*>\s*' | \
 sed -E 's/(^.*project\s*=\s*\")(.*)(\"\s*network\s*=\s*\"$networkByte\".*>\s*)/\2/'`

Здесь используется переменная $networkByte, но ее значение не вставляется в команду, как хотелось бы, а вместо этого всовывается строка «$networkByte».

А как сделать, чтобы в команду вставлялось значение переменной?

Xintrea
()

Почему работает доступ к значению без $ в условном выражении?

 , ,

Сейчас наткнулся вот на такую особенность:

#!/bin/bash

regExpLen="1"

if [[ regExpLen -eq 1 ]]; then
  echo "Равно 1"
fi

Вопрос: почему в условии можно не писать $regExpLen, почему работает просто имя переменной?

Xintrea
()

Как выполнить команду в Bash из переменной?

 , , ,

Проблема при выполнении следующего куска кода. Скрипт запускается от обычного текущего пользователя:

#!/bin/bash

    hostIp="192.168.150.101"
    userPwd="12345"

    echo "Настройка хоста $hostIp"

    command="sshpass -p '$userPwd' ssh-copy-id -i ~/.ssh/id_rsa.pub user@$hostIp"
    echo "Выполняется команда:"
    echo "$command"
    $command

При запуске этого когда, в консоли видим следующую ошибку:
Настройка хоста 192.168.150.101
Выполняется команда:
sshpass -p '12345' ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.150.101

/usr/bin/ssh-copy-id: ERROR: failed to open ID file '~/.ssh/id_rsa.pub': Нет такого файла или каталога

Но дело в том, что, файл открытого ключа существует. Мало того, если в консоли скопировать «сконструированную» скриптом команду, и выполнить ее:
sshpass -p '12345' ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.150.101

то эта команда выполнится без проблем, и ключ будет прописан на удаленной машине.

Вопрос: почему не выполняется команда внутри скрипта? При этом почему она нормально выполняется в консоли?

Xintrea
()

Как в SED обработать диапазон строк?

 , диапазон

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

...
[AC]
icon=battery-charging

[AC][DPMSControl]
idleTime=3600

[AC][HandleButtonEvents]
lidAction=64
powerButtonAction=8

[Battery]
icon=battery-060

[Battery][DPMSControl]
idleTime=300

[Battery][HandleButtonEvents]
lidAction=64
powerButtonAction=16

[LowBattery]
icon=battery-low

[LowBattery][BrightnessControl]
value=30

[LowBattery][HandleButtonEvents]
lidAction=64
powerButtonAction=16
...

Я хочу обработать диапазон строк между:
[AC][HandleButtonEvents]
...
[.*

В этом диапазоне надо изменить значение powerButtonActions.

Я пытаюсь сделать так:
cat f.txt | sed /\[AC\]\[HandleButtonEvents\]/,/\[.*/s/powerButtonAction\s*=\s*.*/powerButtonAction=125/

Но получаю ошибку:

sed: -e выражение #1, символ 81: незавершенное адресное регулярное выражение

Вопрос: как правильно написать эту команду?

Xintrea
()

Как в Python 2.7.13 изменить INI-файл с субсекциями?

 ,

Имеется INI-файл с вот такой структурой:

...
[AC]
icon=battery-charging

[AC][DPMSControl]
idleTime=3600

[AC][HandleButtonEvents]
lidAction=64
powerButtonAction=8

[Battery]
icon=battery-060

[Battery][DPMSControl]
idleTime=300

[Battery][HandleButtonEvents]
lidAction=64
powerButtonAction=16

[LowBattery]
icon=battery-low

[LowBattery][BrightnessControl]
value=30

[LowBattery][HandleButtonEvents]
lidAction=64
powerButtonAction=16
...

Здесь видно, что HandleButtonEvents - это «субсекция», а основная секция задается перед субсекцией в той же строке. Не знаю, является ли это стандартом для INI-файлов или нет, не я этот файл создавал.

Задача - поменять значения powerButtonAction в различных субсукциях.

Пробовал достучаться до нужного значения так (хотя бы считать):
import ConfigParser
config=ConfigParser.ConfigParser()
config.read('$fileName')

print( config.get('AC][HandleButtonEvents', 'powerButtonAction' ) )

Но возникает ошибка:
      "Traceback (most recent call last):",
      "  File \"<stdin>\", line 5, in <module>",
      "  File \"/usr/lib/python2.7/ConfigParser.py\", line 607, in get",
      "    raise NoSectionError(section)",
      "ConfigParser.NoSectionError: No section: 'AC][HandleButtonEvents'"

Вопрос: как работать с такими файлами?

UPD: При необходимости могу поставить Python 3.5.3, если это будет нужно для решения.

Xintrea
()

Как установить Linux-шрифты в Windows?

 , ,

Весь интернет забит статьями о том, как установить в Linux шрифты Microsoft и другие популярные Windows-шрифты.

А мне сейчас потребовалось сделать обратное действие: нужно стандартный набор шрифтов, который стоит по-умолчанию в Debian 9, установить в Windows. Как это сделать?

Может быть, есть какие-то LinuxFontPack или еще что-то такое для Windows? Или можно установить пачку шрифтов ручками? Откуда эту пачку взять? Как установить?

Xintrea
()

Нужно ли пробрасывать mouseMoveEvent в QTableView?

 , , обработчик,

Возник такой теоретический вопрос: если в классе, унаследованном от QTableView, имеется своя реализация mouseMoveEvent, то нужно ли в моменты, когда собственной обработки внутри переопределенного mouseMoveEvent не предусмотрено, вызывать родительский mouseMoveEvent?

void MyView::mouseMoveEvent(QMouseEvent *event)
{
  ...
  QTableView::mouseMoveEvent(event);
}

Можно ли вообще не делать вызова родительского mouseMoveEvent? На что отсутствие вызова родительского mouseMoveEvent может повлиять?

На первый взгляд действительно, родительский обработчик mouseMoveEvent можно вообще не вызывать. Но может быть, есть какие-то неочевидные ситуации? Например, если не вызывать, то перестанет правильно работать драг-анд-дроп в режиме мультивыбора, или там перестанет выделяться строка при настройке QAbstractItemView::SelectRows после клика мышки на незаполненной строками области таблицы, или еще какая-нибудь замудренная хрэнь?

Xintrea
()

Как выполнить несколько SQL-команд для PostgreSQL в Ansible?

 , ,

Имеется Astra Linux 1.3, PostgreSQL 9.1.6, Ansible 2.9.16

В инстансе базы данных неожиданно перестали создаваться таблицы.

Создание таблицы приводит к ошибке:

  - name: Create a new database impulse
    postgresql_db:
      name: impulse
      encoding: UTF-8
      lc_collate: ru_RU.UTF-8
      lc_ctype: ru_RU.UTF-8
      owner: impUser
...
FAILED! => 
{"changed": false, 
 "msg": "Database query failed: 
         new encoding (UTF8) is incompatible with the encoding 
         of the template database (SQL_ASCII)\n
         ПОДСКАЗКА:  Use the same encoding as in
         the template database, or use template0 as template.\n"}

Чтобы исправить эту ошибку, необходимо выполнить следующий SQL-скрипт (взят отсюда):
  - name: Исправление кодировки шаблона базы данных
    postgresql_query:
      query: |
        update pg_database set datallowconn = TRUE where datname = 'template0';
        update pg_database set datistemplate = FALSE where datname = 'template1';
        drop database template1;
        create database template1 with encoding = 'UTF-8' lc_collate = 'ru_RU.UTF8' lc_ctype = 'ru_RU.UTF8' template = template0;
        update pg_database set datistemplate = TRUE where datname = 'template1';
        update pg_database set datallowconn = FALSE where datname = 'template0';

Однако выполнение такого плейбука завершается ошибкой:
FAILED! => {"changed": false, 
"msg": "Cannot execute SQL 'drop database template1;\n
create database template1 with encoding = 'UTF-8' 
lc_collate = 'ru_RU.UTF8' lc_ctype = 'ru_RU.UTF8' 
template = template0;\n'

None: DROP DATABASE cannot run inside a transaction block\n"}

То есть, похоже, что Ansible сама заворачивает выполнение SQL-команд в транзакцию. Я нашел тему, что можно принудительно сначала завершить транзакцию, а потом ее открыть. То есть получится, что сначала выполняется пустая транзакция, потом SQL-команды вне транзакции, и потом опять пустая транзакция:
  - name: Исправление кодировки шаблона базы данных
    postgresql_query:
      query: |
        end; 
        update pg_database set datallowconn = TRUE where datname = 'template0';
        update pg_database set datistemplate = FALSE where datname = 'template1';
        drop database template1;
        create database template1 with encoding = 'UTF-8' lc_collate = 'ru_RU.UTF8' lc_ctype = 'ru_RU.UTF8' template = template0;
        update pg_database set datistemplate = TRUE where datname = 'template1';
        update pg_database set datallowconn = FALSE where datname = 'template0';
        begin;

Но тогда появляется другая ошибка:
FAILED! => {
"changed": false, 
"msg": "Cannot execute SQL 
'end;\n
update pg_database set datallowconn = TRUE where datname = 'template0';\n
update pg_database set datistemplate = FALSE where datname = 'template1';\n
drop database template1;\n
create database template1 with encoding = 'UTF-8' lc_collate = 'ru_RU.UTF8' lc_ctype = 'ru_RU.UTF8' template = template0;\n
update pg_database set datistemplate = TRUE where datname = 'template1';\n
update pg_database set datallowconn = FALSE where datname = 'template0';\n
begin;\n' 

None: DROP DATABASE cannot be executed from a function
or multi-command string\n"}

Далее я уже не могу придумать как обходить эти ограничения.

Вопрос: как в Ansible сделать простейшее действие: выполнить несколько SQL-команд?

Xintrea
()

Как превратить «узкий неразрывный пробел» E2 80 AF в обычный пробел?

 ,

Имеется файл в кодировке UTF-8 с национальными символами, в котором встречаются «узкий неразрывный пробел» с кодами E2 80 AF.

Эти пробелы нужно преобразовать в обычные пробелы.

Как по-быстрому это можно сделать?

Xintrea
()

Как удобно написать развесистое условие через jinja2 в yml?

 , , ,

В файле all.yml мне надо написать примерно такое:

all:
  vars:
    ...
    targetPath: "{% if   distId=='debian8' %}blablabla1
                 {% elif distId=='debian9' %}blablabla2
                 {% elif distId=='astra13' %}blablabla3
                 {% endif %}|trim()"

Проблема в том, что в таком виде фильтр trim() не работает, потому что ему на вход надо подавать строку. А чтобы обозначить строку, надо выражение {% if ... %} заключить в кавычки. Но в этом коде уже использованы двойные и одинарные кавычки.

Как обойти это ограничение?

Xintrea
()

Сложное вычисление на Python и засовывание результата в Ansible

 ,

Нужно мне сделать некоторые вычисления на Python, и результат получить в Ansible.

Делаю так:

  - name: Вычисление суммы
    shell: |
      python <<< "print 1+2"
    register: result

  - debug:
      msg: Результат {{result}}

И при исполнении плейбука ошибка:
fatal: [generatorHost]: FAILED! => {"changed": true, "cmd": "python <<< \"print 1+2\"\n", "delta": "0:00:00.001918", "end": "2020-11-24 15:25:22.719117", "msg": "non-zero return code", "rc": 2, "start": "2020-11-24 15:25:22.717199", "stderr": "/bin/sh: 1: Syntax error: redirection unexpected", "stderr_lines": ["/bin/sh: 1: Syntax error: redirection unexpected"], "stdout": "", "stdout_lines": []}

При этом простое выполнение команды в командной строке работает правильно:
$ python <<< "print 1+2"
3

Как сделать так, чтобы получить значение питоновской команды?

Xintrea
()

Ansible и Python - как написать условие наличия элемента в списке внутри списка?

 , , ,

В конфигурации Ansible сделан такой список Git-репозитариев:

gitRepos:
- [ "twp.git",                   "master",    "twp",                   "twp.pro" ]
- [ "impulse.git",               "radioline", "calc_impulse",          "impulse.pro" ]
- [ "doxygen_documentation.git", "master",    "doxygen_documentation", "" ]

Как видно, это список (из трех элементов), состоящий из списков (из четырех элементов). На самом деле, список гораздо больше, около 50 записей.

В процессе работы список Git-репозитариев может меняться: в нем постоянно добавляются и удаляются различные строки.

Мне нужно написать такую задачу (task), которая должна проверить наличие строки «doxygen_documentation» в третьем столбце переменной gitRepos, и если такового ни в одной строке нет, завершить работу плейбука:
  - name: Проверка наличия Git-репозитария doxygen_documentation в списке обрабатываемых
    fail: msg="Не подключен репозитарий doxygen_documentation в all.yml"
    when: "<тут какое-то условие проверки gitRepos>"

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

Xintrea
()

Как заставить Ansible выводить сообщения об отсутствии переменных?

 ,

Есть инвентарь, внутри которого прописаны переменные:

---

all:
  vars:

    variable1: "a10"
    variable2: "b20"
    variable3: "{{ nonVariable }}30"

Видно, что для инициализации переменной variable3 нужно существование переменной nonVariable, но она специально не создана.

Что будет происходить если запустить плейбук с использованием такой переменной?
---
- hosts: all
  tasks:

  - name: Переменная variable1
    debug: var=variable1

  - name: Переменная variable3
    debug: var=variable3

А все будет нормально, просто переменная variable3 будет undefined:
TASK [Переменная variable3] *****
ok: [remoteHost] => {
    "variable3": "VARIABLE IS NOT DEFINED!"
}

То есть, не будет предупреждения, что нет переменной nonVariable, просто не будет определена переменная variable3.

А хотелось бы видеть или предупреждение или причину, по которой variable3 было не определено. Как это можно сделать?

Xintrea
()

Как в Ansible подключить файл с переменными через конфиг?

 , ,

Мне нужно использовать несколько «проектов» Ansible, каждый из которых находится в своей директории. Но для этих нескольких «проектов» мне нужно иметь yml-файл с общими переменными.

Я думал, что указать файл с переменными можно в ansible.cfg ( который размещается рядом с плейбуками). Но в документации такой опции не нашел.

Согласно вот этой статье:

https://www.toptechskills.com/ansible-tutorials-courses/ansible-include-impor...

получается, что файл с общими переменными надо прописывать в каждом плейбуке. Но у меня этих плейбуков по 50 штук на каждый проект, не буду же я в каждый плейбук прописывать.

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

Xintrea
()

Хочется странного: кросс-платформенный менеджер буфера обмена через файловую систему

 

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

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

Итак, в моем распоряжении два компьютера: рабочий с Linux без Интернета, и дополнительный с Windows и Интернетом. Они находятся в физически разных подсетях, но на одном столе. У них есть доступ к файловому серверу, который видится и в Linux, и в Windows. Файловый сервер не под моим контролем, но файлы я могу создавать и с Linux, и с Windows.

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

Xintrea
()

Установка 64-битного Microsoft Office в Wine

 , , ,

Системное окружение
-----------------------------------

Операционка: Debian 9 Stable 64 bit
Wine: 5.0.2 из репозитария winehq (deb https://dl.winehq.org/wine-builds/debian/ stretch main)

Нужно установить:

Коробочный Microsoft Office 2010.
Нужно поставить именно 64-х битную версию, т.к. к нему идет закупленный 64-х битный Visio.


Процесс установки
--------------------------------

В /etc/ld.so.conf прописан путь до 64-х битных библиотек, и обновлен кеш через ldconfig:

/opt/wine-stable/lib64

Ставлю офис так:
mkdir ~/.msoffice64
export WINEPREFIX=~/.msoffice64
export WINEARCH=win64
winecfg
./winetricks corefonts allfonts 
./winetricks msxml3 msxml4 msxml6
./winetricks vcrun2005 gdiplus riched30
wine /media/cdrom0/x64/setup.exe

И появляется ошибка: «Язык установочного пакета не поддерживается». В логе установки видно следующее:
...
All OS requirement check passed
Checking if CLSID_DOMDocument60 can be created.
Checking the version of MSXML6.
MSXML version check passed. Minimum required version is [6.10.1129], installed Version is [6.20.2003].
Parsing setup.xml file: D:\x64\Access.ru-ru\setup.xml
Error: Installation of this product requires operating system supplemental language support. Type: 54::NoSupportedCulture.
Error: Installation of this product requires operating system supplemental language support. Type: 54::NoSupportedCulture.
Error: Installation of this product requires operating system supplemental language support. Type: 54::NoSupportedCulture.
Showing parent-less message Title: 'Setup Error', Message: 'Язык установочного пакета не поддерживается.'
Message returned: 1
Catalyst execution finished: 11/10/2020 16:53:56.  Return code: 30054.  Exception caught: NoSupportedCulture.
PERF: TickCount=18528814 Name=RunSetup Description=End function

Как-то можно это исправить?

Xintrea
()

Разрешение доступа к сети в WINE

 ,

Имею Debian 9 Stable 64 bit и Wine 5.0.2 из winehq репозитария.

Проблема в том, что внутри Wine недоступен прямой доступ к сети:

$ wine ping linux.org.ru
0009:err:winediag:IcmpCreateFile Failed to use ICMP (network ping), this requires special permissions.
Pinging linux.org.ru [178.248.233.6] with 32 bytes of data:
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.

Ping statistics for 178.248.233.6
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)

В интернетах пишут, что это потому что не разрешены «возможности» для бинарников wine: https://forum.winehq.org/viewtopic.php?t=31134

Пробую установить возможности доступа к сети. Под рутом даю команды:
setcap cap_net_raw+epi "$(readlink -f "/usr/bin/wine")"
setcap 'cap_net_bind_service=+ep' "$(readlink -f "/usr/bin/wine-preloader")"

Они молча отрабатываются. Но после установки «возможностей», wine перестает находить свои библиотеки:
$ wine
wine: error while loading shared libraries: libwine.so.1: cannot open shared object file: No such file or directory

Если сбросить «возможности»:
setcap -r "$(readlink -f "/usr/bin/wine")"
setcap -r "$(readlink -f "/usr/bin/wine-preloader")"

... то wine опять начинает нормально работать:
$ wine
Usage: wine PROGRAM [ARGUMENTS...]   Run the specified program
       wine --help                   Display this help and exit
       wine --version                Output version information and exit

Но работает, естественно, без доступа к сети.

Независимо от того, установлены «возможности» или нет, библиотека libwine.so.1 видна в ldconfig:
# ldconfig -p | grep libwine
        libwine.so.1 (libc6,x86-64) => /opt/wine-stable/lib64/libwine.so.1
        libwine.so (libc6,x86-64) => /opt/wine-stable/lib64/libwine.so


Вопрос: как заставить wine иметь полный доступ к сети?

Xintrea
()

Не могу создать ярлык запуска в LXDE

 , ,

Чтобы запустить bash-скрипт, я создал файл ярлыка:

/home/user/Desktop/connectItcServer.desktop

Содержание:
[Desktop Entry]
Version=1.0
Encoding=UTF-8
Type=Application
Name=Соединение с ИТЦ
Icon=gparted
Exec=/opt/script/connectItcServer.sh
Terminal=true
Path=/opt/script/
Categories=ConsoleOnly;Utility;

Права на /home/user/Desktop/connectItcServer.desktop - 644
Права на /opt/script/connectItcServer.sh - 755

Однако, при запуске ярлыка, bash-скрипт не выполняется. Вместо этого появляется окно:

Этот текстовый файл «Соединение с ИТЦ», судя по всему является исполняемым скриптом.
Какое действие вы ходите выполнить?
[Выполнить] [Запустить файл в терминале] [Открыть] [Отменить]

Если нажать «Выполнить», то скрипт начнет выполняться.

Но мне нужно, чтобы сразу при запуске ярлыка просто выполнился скрипт.

Это вообще возможно?

Xintrea
()