Команда 'command' не найдена в подпроцессе python

Добавьте пользователя в mysql следующим образом:

user@server1

Именно так MySQL ожидает иметь пользовательские записи для удаления соединения. И разрешить этому пользователю управлять базой данных вы используете в php приложении.

Пользователь создается в MySQL с помощью команды:

CREATE USER 'user'@'server1' IDENTIFIED BY 'password';

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

GRANT ALL PRIVILEGES ON database.* TO 'user'@'server1';

, где 'database' является именем вашей базы данных

-121--289815-

(Это несколько пересекается с некоторыми из других ответов.)

  1. Я несколько запутался. Вы говорите:

    Я хочу добавить содержимое файла firewall.txt в файл result.txt перед строка, которая сохраняется в переменной search _ последовательность .

    Хорошо, прежде всего, если они не являются существенной частью вопроса, полные пути (/root/... ) загромождают ваш вопрос и не добавляют никакого значения. Просто используйте простые имена файлов. В конце концов, Я надеюсь, что вы отлаживаете это в локальном каталоге, не запущенном как root.

    Во-вторых, то, что является полезным, дает некоторые примеры данных. Не строки 2000, которые вы на самом деле имеете в ваших фактических файлах, но несколько строк. (Опять же: вы отлаживаете это на тестовых файлах, не так ли?) Например, например, result.txt содержит

     Один, два,
    / sbin/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT
    Пристегните мою обувь.
    

    и firewall.txt содержит

     Humpty Dumpty, сидевший на стене.
    

    Вы говорите,

    Если firewall.txt содержит [только] одну строку, сценарий

     # !/bin/bash
    search_string="\/sbin\/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT ";
    разделители = $ (cat/root/firewall/firewall.txt);
    sed -i 's/$ search _ string/$ delimeters $ search _ string/"/root/result.txt
    

    работает.

    (По пути вам не нужны точки с запятой на концах строк, а слово «разделитель» пишется в середине словом «предел».) Все вышесказанное дает такой результат:

     Один, два,
    Горбатый Болтун сидел на стене ./sbin/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT
    Пристегните мою обувь.
    

    Действительно ли это то, чего вы хотите? Потому что это не то, что большинство людей думают, когда вы говорите: «добавьте [text] в [a] файл перед строкой», особенно когда вы начинаете говорить о вставляемом тексте наличие более одной строки, и тем более, что вы сказали, что линейные дорожки должны оставаться там тот же путь, что и в firewall.txt . Я предполагаю, что вы действительно хотите

     Один, два,
    Горбатый Болтун сидел на стене.
    / sbin/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT
    Пристегните мою обувь.
    

    Если требуется последняя строка файла firewall.txt конкатенация со строкой /sbin/iptables , пожалуйста, объясните точнее, что вы хотите.

  2. Вы говорите,

     search _ последовательность = «\/sbin\/iptables -A INPUT -p tcp --dport 12443 -j ACCEPT »;
    разделители = $ (cat/root/firewall/firewall.txt);
    заменен = «$ delimeters» | sed -r 's/\\n/\\\\n/g'
    sed -i 's/$ search _ string/$ заменил $ search _ string/"/root/result.txt
    

    Ну,это ерунда; третья строка отвечает

     -bash: Горбатый Болтун сидел на стене.: команда не найдена
    

    Возможно, вы имели в виду

     заменить =  $ (эхо  «$ delimeters» | sed -r 's/\\\n/\\\n/g' ) 

    ?

  3. OK, даже если вы сказали

     заменить = $ (эхо «$ delimeters» | sed -r 's/\\n/\\
    

    это не принесло бы пользы, потому что sed нормально работает строка за раз, и она не будет видеть новые строки как символы в строках (даже если его входные данные поступают от переменной оболочки который имеет многострочное значение; это ничем не отличается от файла с несколькими строками). Что работает (исключение бесполезного использования cat ), то

     заменяется = $ (sed 's/$/\\/' firewall.txt)
    sed "s/$ search _ string/$ заменен
    $ search _ последовательность/" result.txt
    

    использование sed 's/$/\\/' для добавления обратной косой черты в конце каждой строки в firewall.txt . Необходимо ввести новую строку ( Enter ) после $ replaced потому что последняя новая линия удаляется при замене команды replaced = $ (...) . И, просто ради простоты, если вы хотите оставить команду /sbin/iptables нетронутой, вы можете рассмотреть возможность изменения окончательной команды на

     sed 's/$ search _ string/$ replaced
    & /» result.txt
    

    используя и в последовательность замены, чтобы сказать «вставьте сюда текст, найденный в последовательности поиска (regex)».

  4. В то время как команда s позволяет вставлять целые строки, на самом деле это не было предназначено для этого. Имеются команды a , i и c для вставки одной или нескольких целых строк из командной последовательности. Но, поскольку текст для вставки поступает из файла, имеет смысл просмотреть команду r ( r ead). В качестве первого среза

     sed «/$ search _ string/r firewall.txt »result.txt
    

    сделает почти то, что вы хотите. Почти. К сожалению, будет введено содержимое файла firewall.txt после строки /sbin/iptables . Я смог найти обходной путь (чтобы получить содержимое firewall.txt перед строкой /sbin/iptables ), но это очень сложно:

     sed -n -e "/$ search _ string/{ s/^/+/; h; r firewall.txt
    n} "-e 'x; с/^ +//р; с/. *//; x; р 'result.txt
    

    Очевидно, sed не распознает ; как разделитель для завершения имени файла, поэтому, когда мы говорим r firewall.txt , мы должны ввести Enter .

    Далее:

    • -n : Не записывайте выходные данные, за исключением команд p или r .
    • /$ search _ string/{...} : Для каждой строки, соответствующей $ search _ последовательность (/sbin/iptables... ), выполните следующие действия:
      • s/^/+/: Вставить + в начало строки (создание +/sbin/iptables... ). Строка помечается как совпадающая со последовательностью поиска. (Я вернусь к этому.)
      • h : Скопируйте образец пространство ( +/sbin/iptables... ) в удерживаемое пространство.
      • r firewall.txt : Чтение файла firewall.txt (и написать его содержимое).
      • n : Прекратите обработку этой строки и прочитайте следующую.
    • Затем для каждой другой строки ( не соответствующие $ search _ последовательность ), выполните следующие действия:
      • x : Обмен содержимым удержания и образцом мест. Т.е. только что прочитанная строка (та, которая не соответствует $ search _ последовательность ) выходит в трюмное пространство, и мы копируем в пространство образца ранее удерживаемую линию (которые могут быть +/sbin/iptables... и могут быть пустыми).
      • s/^ +//p : Если строка является сохраненным совпадением поиска последовательности (т.е. это помеченная строка, содержащая +/sbin/iptables... ), снимите + и распечатайте остальное. В противном случае ничего не печатайте.
      • s/. *//: Вытирать линию (заменить все ничем). Я хотел бы сделать d ( d elete) здесь, но это завершает обработку текущей строки.
      • x : Обменяйтесь содержимым удержания и образца мест еще раз. Переместите пустую строку из пространства образца в пространство хранения. и получить строку из result.txt , которую мы только что там спрятали. И наконец...
      • p : Напечатайте строку из result.txt .

    Короче говоря,

    • Когда мы находим строку, соответствующую $ search _ последовательность (т.е. /sbin/iptables... ), сохраняем в трюмном пространстве (без печати), и чтение (и печать) файла firewall.txt .
    • Для каждой другой (т.е. несоответствующей) строки вытаскиваем сохраненную линию (если она имеется) из удерживаемого пространства и печатаем ее, а затем напечатайте текущую строку.

    Арг! Это происходит, если /sbin/iptables... происходит на последней строке, потому что он сохраняется в пространстве хранения, но нет последующей несоответствующей строки, чтобы инициировать ее извлечение.

    Давайте просто убедимся, что /sbin/iptables... никогда не происходит на последней строке, добавляя фиктивную линию в конце, а затем стратегически удаляя её.

     echo > > result.txt
    sed -n -e "/$ search _ string/{ s/^/+/; h; r firewall.txt
    n} "-e 'x; s/^ +//p; $ d; с/. *//; x; р 'result.txt
    

    $ d приводит к удалению последней строки. (Мы можем использовать $ q и получить тот же эффект.)

    Это работает, если существует несколько iptables строк. Но, да, это становится чем-то вроде Клюджа. Полагаю, sed «s/$ search _ string/$ replaced newline &/» ответ сейчас выглядит не так уж плохо.

0
10.03.2018, 12:16
3 ответа

commandявляется встроенной оболочкой, поэтому не является собственным объектом в файловой системе.

См. man bash/ man zshили help command.

$ python3 -c 'import subprocess ; subprocess.run(["bash","-c","command -v yes"])'
/usr/bin/yes

Может быть решением (У меня не установлено zsh, поэтому в моем примере вместо )используется bash.

3
28.01.2020, 02:32
import subprocess
subprocess.run(['command', executable='/bin/bash',shell=True])
-1
28.01.2020, 02:32

Если вы используете Python 3.5, вам не нужно использовать command -v, чтобы получить путь к исполняемому файлу.shutil.which()(доступно из 3.3, я думаю ).

import shutil
yes_path = shutil.which('yes')

Пример:

$ python3 -c 'import shutil; print(shutil.which("yes"))'
/usr/bin/yes
0
28.01.2020, 02:32

Теги

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