Добавьте пользователя в mysql следующим образом:
user@server1
Именно так MySQL ожидает иметь пользовательские записи для удаления соединения. И разрешить этому пользователю управлять базой данных вы используете в php приложении.
Пользователь создается в MySQL с помощью команды:
CREATE USER 'user'@'server1' IDENTIFIED BY 'password';
И вы предоставляете привилегии пользователю с такой командой:
GRANT ALL PRIVILEGES ON database.* TO 'user'@'server1';
, где 'database' является именем вашей базы данных
-121--289815-
(Это несколько пересекается с некоторыми из других ответов.)
Я несколько запутался. Вы говорите:
Я хочу добавить содержимое файла
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
,
пожалуйста, объясните точнее, что вы хотите.
Вы говорите,
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' )
?
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)».
В то время как команда 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 &/»
ответ сейчас выглядит не так уж плохо.
command
является встроенной оболочкой, поэтому не является собственным объектом в файловой системе.
См. man bash
/ man zsh
или help command
.
$ python3 -c 'import subprocess ; subprocess.run(["bash","-c","command -v yes"])'
/usr/bin/yes
Может быть решением (У меня не установлено zsh
, поэтому в моем примере вместо )используется bash
.
import subprocess
subprocess.run(['command', executable='/bin/bash',shell=True])
Если вы используете 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