Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Передать результат команды в другую

Друзья, прошу помощи в написании скрипта.
Необходимо очищать бинарные логи mysql, которые быстро разрастаются. Прошу не пинать, сам знаю, что это костыль да и качество кода оставляет желать лучшего.
Почти осилил скрипт, но не могу заставить работать основную команду вида:
Bash
1
mysql -u RemoteRoot -pdfd4r4rfds -h 10.10.0.22 -v -e "PURGE BINARY LOGS TO 'mysql-bin.010'";

Вот скрипт, пароли id телеграма изменены, так что все нормально:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash 
#=========================Calculating free space in /
var=$(df -h / | grep "/dev/" | awk '{print $4}')
tmp1=${var::-1}
#==========================Checking variable's value
if (( tmp1 < 50))
                then
                    #==========================Writing data to log and sending message via Telegram 
                    echo "` date '+ %y-%m-%d %H:%M:%S'` free space is $tmp1 Gb. Urgent removal activated." >> /tmp/binlog_remover_script.txt  
                    curl -v --show-error -x socks5://10.10.0.21:20001 -s -X POST https://api.telegram.org/bot623965848:AAFSmsdsaPXBDA4Cn3Zh-mUnuFdU35WiXm8/sendMessage -F chat_id=-293723449 -F text="There is a lack of free space on mysqldb (22 server). Urgent binlog remover script activation." >> /tmp/binlog_remover_script.txt
                    #==========================Finding middle file in list and deleting all binlogs until it
                    ls /var/lib/mysql/ | grep  mysql-bin.'[0-9]' > /tmp/tmp_rows_counter.txt
                    tmp2=`wc -l /tmp/tmp_rows_counter.txt | awk '{print $1}'`
                    let "tmp2 = tmp2 / 2"
                    tmp3=`nl /tmp/tmp_rows_counter.txt | grep $tmp2 | awk '{print $2}' | grep -v $tmp2`
                    #========================== tmp3 is filename 
                    tmp4=`echo "\"PURGE BINARY LOGS TO '$tmp3'"\"` 
                    
                    mysql -u RemoteRoot -pdfd4r4rfds -h 10.10.0.22 -v -e $tmp4
                else
                    echo "` date '+ %y-%m-%d %H:%M:%S'` binlogs are so big, free space is $tmp1 Gb" >> /tmp/binlog_remover_script.txt
                fi
Ответ: Всем спасибо, вопрос решен.

Сообщение от Marinero
Ну а то что Вы творите с командами - это от незнания их опций черезчур увлекаетесь grep и awk
Тут полностью согласен, приходится лезть в БАШ один раз в 2 года, так что ни времени ни мотивации особо нет.
Вопрос: Расшифровать результат команды od

Всем привет.у меня стоит задача: есть файл file в нём какой-то текст. выполнили команду cat file | od -An -to4 её результат: 14730266146 06115661137 07116231065 06214462146 14230630546 00016030542 . нужно узнать что было изначально в file.
Ответ: что было изначально в файле неизвестно(файла нет есть только результат команды)
Вопрос: Получение результата от FTP комманды

Всем привет. Появилась задачка получать по FTP строку и обрабатывать ее в bash.
Сервер обучен команде time, которая возвращает строку формата dd.mm.yyyy hh:nn:ss

Нужен скрипт похожий на такое:
Bash
1
2
3
4
5
6
ftp 127.0.0.1 21
$Переменка=quote TIME
close
 
Работаем с $Переменка
...
Как правильно в Линуксе (Suse 10, если принципиально) читать результат команды?
Ответ:
Сообщение от nezabudka
озвучте найденное решение
Легко: plink.exe из Putty. С той лишь разницей, что информация будет запрошена не с Линукса, а наоборот передана на Линукс.
Предварительное решение конкретно под частный случай для линукса. В дальнейшем продумываю написать нативочку на Лазарусе. Или вообще в течении года заменить те дурацкие ПО, что в задаче участвуют на более новые и удобные.

P.S. Есть и еще одно решение именно баш скриптом, но я не буду его озвучивать.
Вопрос: Передать аргументы команды переменными

Я плохо знаком с башем, пытаюсь разбить аргументы команды на переменные, но почему-то выдаёт ошибки, не могу понять почему, можете подсказать? Вот я сделал пример:
Bash
1
2
3
4
5
6
7
8
#!/bin/bash
 
l="-l"
time="--time-style='+%Y-%m-%d %H:%M:%S'"
ignore="-I 'В*?'"
 
 
ls $l $time $ignore
Ответ: Ну наконец-то! Пробуйте:
Bash
1
2
3
4
time='--time-style=+%Y-%m-%d %H:%M:%S'
ignore='--ignore=В*?'
 
ls "$time" "$ignore"
Вопрос: Как сделать конкатенацию результата команды со строкой.

Подскажите.

Команда возвращает список: cat /home/kushnira/AP_GLREF_INST.txt | awk '{print $1}'


AP_GLREF_INST_RDDH_F
AP_GLREF_INST_F_SET_LBD
AP_GLREF_INST_F_SET_FILEID
AP_GLREF_INST_F_GET_RDDH_FILES


Как сделать конкатенацию со строкой и вывести на экран?

Должно получится

delete_job: AP_GLREF_INST_RDDH_F
delete_job: AP_GLREF_INST_F_SET_LBD
........
Ответ: echo test|awk '{print "deleted:"$1}'
deleted:test
Вопрос: Выполнение Bash команд из bat файла

Как передать bash команды из bat файла?
вот все команды которые я хочу выполнить.

docker cp C:\Users\usr\Desktop\in\input.wav main:/home/main-ru-0.4
docker exec -it main bash
Bash
1
2
cd /home/main-ru-0.4
./decode.sh
Код
docker cp main:/home/main-ru-0.4/outlog.txt C:\Users\usr\Desktop\out
после второй строки перестает выполняться.
Пробовал использовать скрипт
Код
docker exec -it main bash /home/main-ru-0.4/decode.sh
Файл видит но не исполняет.
Ответ: Пути проверьте
Вопрос: команда Make в debian7 ругается.

добрый день! озадачился поддержкой OpenGL приложений в debian. с этой целью был скурен мануал, скачан пакет wine-1.6.2 и найден подходящий бубен. начинаю танцевать -

root@odin:/home/zloi/wine-1.6.2# nano tools/wineinstall
#здесь меняем строку CONFARGS= "" на CONFARGS="--with-opengl --disable-debug --disable-trace"
root@odin:/home/zloi/wine-1.6.2# sudo apt-get install auto-apt checkinstall sudo auto-apt -y run ./configure
# тут тоже вроде б все норм проходит,
# теперь собираем
root@odin:/home/zloi/wine-1.6.2# make
make: *** Не заданы цели и не найден make-файл. Останов.

результат команды ls -l /usr/bin/*make

-rwxr-xr-x 1 root root 41376 ноя 25 2012 /usr/bin/ccxxmake
-rwxr-xr-x 1 root root 160396 апр 15 2012 /usr/bin/make
-rwxr-xr-x 1 root root 4872 апр 18 2012 /usr/bin/pbmmake
-rwxr-xr-x 1 root root 4288 апр 18 2012 /usr/bin/ppmmake

root@odin:/home/zloi/wine-1.6.2# ls Makefile*
Makefile.in
но это ж просто шаблон....

вот общий ls
root@odin:/home/zloi/wine-1.6.2# ls
aclocal.m4 configure.ac include Makefile.in programs
ANNOUNCE COPYING.LIB libs Make.rules.in README
AUTHORS dlls LICENSE Maketest.rules.in server
config.log documentation LICENSE.OLD Make.vars.in tools
configure fonts loader po VERSION

куда дальше?
Ответ:
Ivan_Pisarevsky
Партизанишь. :) Поезда уже не надо под откос пускать.


было б что в тех поездах... давно б уже пускал. а так - жену мне надо, 28 лет, а я до часу ночи на работе пытаюсь в дебиане настроить wine для того, чтоб в сталкера можно было играть, не переключаясь на винду. такими темпами и до Gentoo недалеко.
Вопрос: Не передавать Rsync’ом уже переданные файлы

Здравствуйте,

Имеется скрипт(Rsync), который передает(синхронизирует) определенные файлы из клиента (Windows/Cygwin) на сервера (Unix). Скрипт каждые 2 минуты срабатывает(через Планировщик заданий). В папке на клиенте не всегда есть файлы т.е. иногда есть файлы, а иногда нет. Если файлы передаются они автоматом заносятся в exclude файл в скрипте и при появлении новых файлов старые уже не передаются.
Сейчас для удостоверения переданности файлов(чтобы заносить их в exclude) использую результат выполнения Rsync, но он мне возвращает всегда код 0 (успешно) даже, когда файлы не передаются и поэтому они ошибочно заносятся в exclude.
Как мне узнать были ли переданы файлы на клиент или нет, чтобы правильно заносить их в exclude?
Ниже выложу скрипт, который сейчас использую.

Кликните здесь для просмотра всего текста

Bash
1
2
3
4
rsync -avz -e ssh --exclude-from=/cygdrive/c/cygwin/home/ivanov/exclude.txt --log-file=/cygdrive/c/cygwin/home/ivanov/rsync.log /cygdrive/c/OUT/{txt*} 
user@192.168.X.X:/incoming
 
ls /cygdrive/c/OUT/ >> /cygdrive/c/cygwin/home/ivanov/exclude.txt


Добавлено через 7 минут
По скрипту:
/cygdrive/c/OUT/ -- папка на клиенте
192.168.X.X:/incoming -- папка на сервере
exclude.txt -- файл exclude, в который записываются переданные файлы.
Ответ: Вообщем нашел решение.

rsync -rtv <source> <dest> | wc -l
Если у команды результат больше 4, то значит файлы были переданы, иначе нет.
Исходя из этого переделал свой скрипт в такой вид:

Bash
1
2
3
4
5
6
newfiles="$(rsync -rtavz --exclude-from=/cygdrive/c/cygwin/home/ivanov/exclude.txt -e ssh user@192.168.X.X:/home/user/test/folder/file* /cygdrive/c/cygwin/home/ivanov/test | wc -l)"
if [[ $newfiles -gt 4 ]]; then
ls /cygdrive/c/cygwin/home/ivanov/test >> /cygdrive/c/cygwin/home/ivanov/exclude.txt
echo "success"
fi
exit
Вопрос: Написать скрипт который обходит открытые sreen’ы на других машинах

Необходимо написать скрипт на python, который открывает все screen'ы открытые на других машинах под моим логином.

Суть проблемы в том, что необходимо скриптом открыть терминал, заломиться по ssh на машину, и открыть указанные screen'ы в нём. Желательно одной командой.

Выбор пал на что-то вроде:
Bash
1
gnome-terminal --command="ssh <user>@<ip> && screen <id>"
Но при таком раскладе терминал открывается, логинится и закрывается, либо просто логинится и выкидывает на приглашение.
Основной вопрос состоит в том, каким образом можно запустить терминал и передать в него список команд на выполнение, притом, чтобы все они выполнились?

Написана часть скрипта на python

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/python
# -*- coding: utf-8 -*- 
 
import sys
import os
import getpass
import pexpect
 
user = os.getlogin()
ip = sys.argv[1:]
pas = list()
screens = dict()
 
for adr in ip:
    pas.append(getpass.getpass("Пароль для %s: "%adr))
 
for ia, adr in enumerate(ip):
    command = "ssh %s@%s ls /var/run/screen/S-%s"%(user, adr, user)
    exp = pexpect.spawn(command)
    exp.expect("password:")
    exp.sendline(pas[ia])
    exp.expect(pexpect.EOF)
    screens[adr] = exp.before
 
for opt in screens:
    screens[opt] = screens[opt].split()
    for isc, screen in enumerate(screens[opt]):
        screens[opt][isc] = screen.split(".")[0]


Заранее благодарен за помощь.
Ответ: Marinero, спасибо, помог ключ -t у ssh.

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

Сообщение от Marinero
Почему именно на нем?
Почему не подходит стандартная процедура ssh команда?
Потому что мне удобнее писать на python, bash я знаю "постольку-поскольку", и что-то сложнее echo "Hello, world" я не напишу на нём. Да и к тому же, я для того и пишу скрипт, чтобы руками не открывать каждый скрин, по 4-6 скринов на 4 - 5 машинах.
Вопрос: Передача вывода команды через конвейер

Здравствуйте!

Помогите, пожалуйста, понять принцип передачи вывода\результата выполнения команды по конвейеру в bash. Вот, например:
Bash
1
2
3
[alexey@Satellite ~]$ echo '123' | tee new_file | > /dev/null
[alexey@Satellite ~]$ cat new_file 
[alexey@Satellite ~]$
Ход выполнения строки 1 я себе представляю так:
Вывод команды 'echo'(символы '123') поступает на вход команды 'tee', которая сначала направляет этот вывод в файл 'new_file', а затем передаёт его дальше по конвейеру(в /dev/null). Но почему же в 'new_file' ничего не записалось? Ведь, по-идее, вывод команды 'echo' должен быть направлен в битоприёмник только после записи в 'new_file'.

Добавлено через 31 минуту

До меня тут вдруг дошло, что написать надо было так:
Bash
1
echo '123' | tee new_file > /dev/null
Но я всё равно не понял, почему в первом случае в 'new_file' ничего не записалось.
Ответ: Alexey104, Небольшая поправка, я перечитала ваше сообщение с первой строчкой
кода и есть что добавить.
Команда tee читает поток из пайпа и синхронно раздваивает его в файл и на стандартный вывод.
Когда вы ставите дальше конвеер то перенаправляете один вывод команды tee со стандартного
выходного потока а конвеер, а второй поток остается направленным в файл, но так как после очередного
конвеера нет команды способной принять информацию то tee работая синхронно с двумя потоками
не передает информацию и в файл тоже.
Вот, думаю понятно и правильно обрисовала работу вашей первой строчки кода. В этом смысл
работы пайпа.

Добавлено через 3 часа 14 минут
volodin661, Создала в заметках памятку, буду исправляться. Спасибо