Ответы пользователя по тегу bash
  • Как проверить исход работы systemctl is-active в Bash-сценарии?

    shambler81
    @shambler81 Куратор тега Linux
    Но у меня был случай когда он работал а сайт лежал притом и fpm работал, а сайт отдавал 500 ( и да бд тоже работала)
    так что я все-же рекомендую идти не от мнения считает ли себя апачь рабочим, а по факту проверять работает ли сам сайт.
    /usr/bin/curl -I http://site.ru 2>/dev/null | head -n 1 | awk -F" " '{print $2}' | grep "200"  || service apache2 restart

    Как алиард это куда как более весомо.
    НУ и от него уже плясать че делать дальше.
    Ответ написан
    Комментировать
  • Как запустит последовательно команды?

    && упрощённая если предидущая завершилась TRUE
    || - упрощённая если команда завершилась с FALSE
    | - упрощённая форма тунелирования подать предидущий stdout на stdin следующей команде
    comand ; comand2 - выполнить последовательно
    не меняй шел а делай это скажем вот так
    тут скрипт $(/bin/bash echo "hello world") тут продолжение скрипта
    все что в переменной выполнится и вернет уже значение
    Ответ написан
    Комментировать
  • Как применить аргументы для команды из массива строк?

    сделай через функцию и все
    Ответ написан
    Комментировать
  • Как вырезать слова из вывода?

    shambler81
    @shambler81 Куратор тега Linux
    sshd -T | grep -i mac | grep --perl-regexp --only-matching ".?mac-[^,]+etm[^,]+"



    Вывод:
    umac-64-etm@openssh.com
    umac-128-etm@openssh.com
    hmac-sha2-256-etm@openssh.com
    hmac-sha2-512-etm@openssh.com
    hmac-sha1-etm@openssh.com


    тут сама регулярка
    https://regex101.com/r/45gMoG/1
    Единственное не совсем понял про
    macs
    по этому исключил его поскольку там разделитель пробел и не понятно что это такое
    если нужен вывод с ним то вот так
    sshd -T | grep -i mac | grep --perl-regexp --only-matching "[^,]*etm[^,]*"
    macs umac-64-etm@openssh.com
    umac-128-etm@openssh.com
    hmac-sha2-256-etm@openssh.com
    hmac-sha2-512-etm@openssh.com
    hmac-sha1-etm@openssh.com
    Ответ написан
    Комментировать
  • Как установить и настроить кучу пакетов в debian через скрипт, и есть ли такие готовые скрипты?

    aapanel
    И управление docker
    и nodejs
    и оркестратором
    1 скрипт 1 Строчка судя по тз вам хватит, кроме vpn ибо это точно не к хостингу.
    ну у впн тоже есть готовые решения, но я не знаю вашей топологии.
    Самый простой из кроссплатформенных softether vpn - в плане функционал настройки.
    На винде отличный GUI
    Ответ написан
    Комментировать
  • Скрипт который прерывается если в директории есть 2 файла с похожим названием?

    shambler81
    @shambler81 Куратор тега Linux
    я немного по другому выбрал количество файлов, но и верхний ответ тоже подходит, в зависимости от сложности имени файла возможно вариант с греп более предпочтительный поскольку можно задать более сложную маску файла, но в текущем тз подходят оба варианта

    if [ "$(ls test* | wc -l)" -le "2" ] ; then  echo true; else echo false; fi


    65311378f2f2f476815859.png
    Для удобства записал в одну строку.

    if -fi -условие

    -le - больше или равно
    then - если условие сработало то выводит эхо
    else - в противном случае
    Ответ написан
    1 комментарий
  • Сравнить файлы и удалить совпадения по первым 7 символам?

    1. крутим циклfor
    2. обрезаем 7 символов в условиме поиска через head -c7 ну или через cat 11.txt |egrep -o .{7}
    там как придумаешь
    3 ищем в массиве grep -v (отрицание шаблона) и выводим его на вывод если true
    Все

    А вот тебе пример с чего можно начать работать
    Обработка содержимого файла

    Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd:

    #!/bin/bash
    IFS=$'\n'
    for entry in $(cat /etc/passwd)
    do
    echo "Values in $entry –"
    IFS=:
    for value in $entry
    do
    echo " $value"
    done
    done

    Ответ написан
  • Как в bash добавить строку в конце файла но перед определенной строке?

    да тут батенька не все так просто, тебе нужно сделать проверку. не добавлен ли он уже в файл, ты же не хочеш плодить дубли. И только после этого добавлять.
    вставить ПЕРЕД найденым можно через sed.
    Вот так
    https://sed.js.org/index.html?snippet=Gz6gka
    А блин да
    sed -e '0,/get_footer/s#.*get_footer.*#вставляемый текст\n&#' /var/www/site.ru/index.php

    Но лучше сделай еще проверку хотябы так
    grep "тут твоя строка которую нужно добавить" /var/www/site.ru/index.php ||  sed -e '0,/get_footer/s#.*get_footer.*#вставляемый текст\n&#' /var/www/site.ru/index.php

    || -false ( в твоем случае строку не нашел)
    && -true
    Если все норм то
    -e меняеш на -i
    тогда это будет не вывод на экран а уже сохранит в файл.

    ps
    если у вас пхп не проще сделать это на нем ?
    Ответ написан
    1 комментарий
  • Как записать вводимые данные в определенном формате?

    Ну и кто тебе мешает считывать собственно в любом из нужных тебе форматов ?
    Sed тебе в помощь.
    https://sed.js.org/?snippet=976nMn
    Например сделаю мак адрес сразу с двумя видами ввода
    #!/bin/bash
    BMCMAC="XX:XX:XX:XX-XX-XX-XX"
    echo "$BMCMAC" | sed  's/-/:/g'

    Вывод
    XX:XX:XX:XX:XX:XX:XX

    2 вариант, убираем и тот и другой символ.
    https://sed.js.org/?snippet=8q6npp
    Вывод
    XXXXXXXXXXXXXX
    Ответ написан
    Комментировать
  • Как объединить скрипты и сделать вывод таблицей?

    Выглядит это как бред сивой кобылы
    ты собираеш информацию из собраного списка сохраняешь ее в текстовый файл называя его баш скрптом хотя в нем только текст, пусть даже в нем есть что-то в начале но по факту это ничего не меняет.
    При этом ты задаешь достаточно простой вопрос по башу
    Давай лучше с начала
    ЧТО ты хотел сделать изначально ?
    Что должно делать это художество в конце?
    Ответ написан
    Комментировать
  • Что не так с кавычками в bash?

    -name - НЕ ПОДДЕРЖИВАЕТ нормальный ситнаксис
    find /home/bitrix/ -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"
    Ответ написан
    3 комментария
  • Как исключить из копирования всей папки, одну папку на .bash?

    shambler81
    @shambler81 Куратор тега Linux
    Батенька сразу несколько замечаний.
    1. Базу дампим желательно через эвал, поскольку пароль может содержать как " так и ' так и { короче нужно извращаться
    eval "$(echo "mysqldump --no-tablespaces -u$DBLOGIN -p'$DBPASS' $DBNAME -h$DBHOST > $SITEDIR/$ELEMENT/$DBNAME\-$DATE.sql  && echo "Дамп БД $DBNAME будет сохранен в корне сайта"  ||  echo "Ошибка дампа базы данных " $DBNAME")"

    2.
    А зачем собственно вы храните это все на сервере, не проще сразу заливать в потоке на нужное место.
    Из плюсов все плюсы заливки 1 файла поскольку он в канале архивный.
    и плюсы все пофайловового копирования поскольку там уже лежит или распакованый если нужн или запакованый сайт.

    сейчас поищу где-то уменя были старые файлики похожие.

    SITEDIR="/home/bitrix/ext_www"                      # Папка до названия доменаов
    DBCONN="bitrix/php_interface/dbconn.php"            # Откуда читать настройки mysql
    FTPUSER="backup_ftp"                                # Логин FTP сервера
    FTPPASS="1111111"                        # Пароль FTP
    FTPHOST="11.154.209.177"                           # сервер FTP
    FTPDIR=""                                           # папка на FTP
    TMPDIR="/mnt/backup/site"                           # тут временный файл лежит до отправки
    TMPWPUTBASE="/mnt/backup"                            # wput подставит эту папку как базовую
    DATE=`date +"%Y-%m-%d"`                             # Формат даты в имени файла
    DATEYM=`date +%Y`/`date +%m`                        # Второй форматы даты
    LIST=${1:-`ls $SITEDIR | grep -E ".*\.\w{1,5}" | grep -v "restore.php" | grep -v "klondike.php"`} # Название сайта, тут выбор или аргумент или, регулярка  можно убрать только -L ;)
    
    mkdir -p $TMPDIR/$DATEYM # создаем  структ уру каталогов если их нет
    
    for ELEMENT in $LIST
        do
                    if [ ! -f /$SITEDIR/$ELEMENT/$DBCONN ];
                            then
                                echo " Файл $SITEDIR/$ELEMENT/$DBCONN не найден, сайт будет без БД!"
                            else
    
    DBLOGIN=$(/bin/php -r "include '${SITEDIR}/${ELEMENT}/${DBCONN}'; echo(\"{\$DBLogin}\");")
    DBNAME=$(/bin/php -r "include '${SITEDIR}/${ELEMENT}/${DBCONN}'; echo(\"{\$DBName}\");")
    DBPASS=$(/bin/php -r "include '${SITEDIR}/${ELEMENT}/${DBCONN}'; echo(\"{\$DBPassword}\");")
    DBHOST=$(/bin/php -r "include '${SITEDIR}/${ELEMENT}/${DBCONN}'; echo(\"{\$DBHost}\");")
    echo "Найдена BD $ELEMENT"
    echo ""
    echo "Login: $DBLOGIN"
    echo "DB   : $DBNAME"
    echo "Pass : $DBPASS"
    echo "Host : $DBHOST"
    echo ""
    echo "Дамп БД $DBNAME"
    
    # только через эвал и эхо смогли экранировать все  пароли
    eval "$(echo "mysqldump --no-tablespaces -u$DBLOGIN -p'$DBPASS' $DBNAME -h$DBHOST > $SITEDIR/$ELEMENT/$DBNAME\-$DATE.sql  && echo "Дамп БД $DBNAME будет сохранен в корне сайта"  ||  echo "Ошибка дампа базы данных " $DBNAME")"
    chown bitrix:bitrix $SITEDIR/$ELEMENT/$DBNAME\-$DATE.sql
                   fi
    
    echo "Считаем количество Файлов  на сайте"
    #SIZE=" $(find $SITEDIR/$ELEMENT/$WEB | wc -l)" && echo " В архиве будет $SIZE файлов"
    SIZE="$(find $SITEDIR/$ELEMENT/$WEB -not -path "$SITEDIR/$ELEMENT/bitrix/tmp/*" -not -path "$SITEDIR/$ELEMENT/bitrix/updates/*" -not -path "$SITEDIR/$ELEMENT/dev_logs/*" -not -path "$SITEDIR/$ELEMENT/upload/1c_import_light/logs/*" -not -path "$SITEDIR/$ELEMENT/upload/1c_import_light/total_errors/*" -not -path "$SITEDIR/$ELEMENT/.git/*" -not -path "$SITEDIR/$ELEMENT/bitrix/catalog_export/logs/*" -not -path "$SITEDIR/$ELEMENT/bitrix/backup/*" -not -path "$SITEDIR/$ELEMENT/bitrix/cache/*" -not -path "$SITEDIR/$ELEMENT/bitrix/managed_cache/*" -not -path "$SITEDIR/$ELEMENT/bitrix/stack_cache/*" -not -path "$SITEDIR/$ELEMENT/upload/resize_cache/*" -not -path "$SITEDIR/$ELEMENT/stats/*" | wc -l)" && echo " В архиве будет $SIZE файлов"
    
    
    echo "Архивируем сайт $ELEMENT прогресс не в килобайтах а в  количестве файлов"
    
      tar -cvpzf $TMPDIR/$DATEYM/$ELEMENT-$DATE.tar.gz --directory $SITEDIR/$ELEMENT/$WEB --ignore-failed-read --exclude='./bitrix/tmp' --exclude='./bitrix/updates'  --exclude='./dev_logs' --exclude='./upload/1c_import_light/logs' --exclude='./upload/1c_import_light/total_errors' --exclude='./.git' --exclude='./bitrix/catalog_export/logs'  --exclude='./bitrix/backup'  --exclude='./bitrix/cache' --exclude='./bitrix/managed_cache' --exclude='./bitrix/stack_cache' --exclude='./upload/resize_cache' --exclude='./stats' . | pv -s $SIZE -l > /dev/null
    
    
    echo $ELEMENT
    
    
    # >> /dev/nool 2> /var/log/backup_error.log
            rm -f $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql # поскльку ложим на реальный сайт, ибо нормально добавить в архив не получитяс.
    
            echo "Сохраняем $ELEMENT на FTP"
    
            wput --basename=$TMPWPUTBASE -p    --no-directories      $TMPDIR/$DATEYM/$ELEMENT-$DATE.tar.gz ftp://$FTPUSER:$FTPPASS@$FTPHOST$FTPDIR && echo "Архив залит успешно, временные файлы удалены"
    >> /dev/nool 2> /var/log/backup_error.log
     #       rm -f $TMPDIR/$DATEYM/$ELEMENT-$DATE.tar.gz
    echo -en "\n\033[37;1;41m Ссылочка:\033[0m \e[1;4;36mwget ftp://$FTPUSER:$FTPPASS@$FTPHOST/site/$DATEYM/$ELEMENT-$DATE.tar.gz\e[0m\n\n" #ks05
    
      done
    
    
      if [ -n "$(cat /etc/nginx/bx/site_enabled/bx_ext_ssl_bike-centre.ru.conf | grep ^ssl_certificate )" ] ; then
           echo "        Найдены активные сертификаты SSL"
    
           cat /etc/nginx/bx/site_enabled/bx_ext_ssl_bike-centre.ru.conf | grep --perl-regexp "^ssl_certificate\s+.*\.pem" | grep  --perl-regexp -o  /.+[^\;]
           cat /etc/nginx/bx/site_enabled/bx_ext_ssl_bike-centre.ru.conf | grep --perl-regexp "^ssl_certificate_key.*\.pem" | grep  --perl-regexp -o  /.+[^\;]
    wput  -u --basename=/etc/ /etc/letsencrypt/live/bike-centre.ru/ ftp://backup_ftp:QWaszx123@178.154.209.177/etc_backup/
       # тут в телегу 
    curl --socks5-basic \-X POST https://api.telegram.org/bot5320773503:************/sendMessage -d chat_id=-676521809  -d \text="Backup site bike-centre.ru OK "

    Может что-то из этого покажется полезным
    скрипт запускается так scrypt.sh site.ru
    если просто то все сайты бэкапятся, соответственно кажыдй со своей базой со своим названием.
    Но тут не в потоке. о этом тут писал. https://klondike-studio.ru/blog/bystro-skopirovat-...
    Так же БД можно заливать сразу на удаленый сервер, притом уже архивную.

    Ну и как исключить я вам тут показал.
    Ответ написан
    Комментировать
  • Как как распарсить .rc файл командой sed?

    как-то так ?

    echo -E "const std::map<unsigned int, std::string> nameMap = {"; cat /tmp/111.txt | egrep IDS | sed -e 's/\(IDS_STRING[0-9]\{1,\}\)[ ]\{1,\}\(.*\)/\{\1\, \2\},/gp'; echo "};"



    Вводный файл
    root@Bonus:/tmp# cat 111.txt
    STRINGTABLE
    BEGIN
        IDS_STRING101           "Example string 1"
        IDS_STRING102           "_Example string 3.14"
    END
    
    STRINGTABLE
    BEGIN
        IDS_STRING103           "Example string 3"
        IDS_STRING104           "_Example string 4"
    END


    Вывод
    root@Bonus:/tmp# echo -E "const std::map<unsigned int, std::string> nameMap = {"; cat /tmp/111.txt | egrep IDS | sed -e 's/\(IDS_STRING[0-9]\{1,\}\)[ ]\{1,\}\(.*\)/\{\1\, \2\},/gp'; echo
    const std::map<unsigned int, std::string> nameMap = {
        {IDS_STRING101, "Example string 1"},
        {IDS_STRING101, "Example string 1"},
        {IDS_STRING102, "_Example string 3.14"},
        {IDS_STRING102, "_Example string 3.14"},
        {IDS_STRING103, "Example string 3"},
        {IDS_STRING103, "Example string 3"},
        {IDS_STRING104, "_Example string 4"},
        {IDS_STRING104, "_Example string 4"},
    };
    root@Bonus:/tmp#


    Собственно по вашему тз.
    теперь что касается строк, вы не привели примера этих строк, но их можно выхватить несколькими способами, начиная с банальных cut и awk с соответствующими разделителями, ну и самим сед тоже можно.
    За разделитель можно взять первое "
    Из пояснений могу добавить что \1 это $1 в синтаксисе седа ;) ну и двойка соответственно $2
    Ответ написан
    Комментировать
  • Не получается составить скрипт?

    1. убираем все лишнее в user.txt
    cat users.txt | egrep ^.[^#]+
    и сохраняем это в переменную это уже пример скрипта
    #!/bin/sh
    list=$(cat users.txt | egrep ^.[^#]+ )


    2. крутим цикл по нему
    #!/bin/sh
    list=$(cat users.txt | egrep ^.[^#]+ )
    
    for element in $list
    do 
        echo "$element" 
    
    done


    3. в цикле grep ищет в файле pass.txt соответствующую строку текущего юзера в цикле, и отображаем только его пароль grep $element pass.txt | cut -f 2 -d ':'
    В результате у нас получится что-то такое:
    #!/bin/sh
    list=$(cat users.txt | egrep ^.[^#]+ )
    
    for element in $list
    do 
        echo "$element"                                                       
        grep $element  pass.txt | cut -f 2 -d ':'                       
        pass=$(grep $element  pass.txt | cut -f 2 -d ':')       
    done


    Собственно у вас уже есть все переменные и текущий юзер $elemen и его пароль $pass.
    Все что вам остается теперь это впихнуть куда нужно, как это сделать я думаю вы уже разберетесь.
    Вам может понадобиться для отладки сервис онлайн генератор sed
    вы не привели пример созданного /etc/passwd соответственно че там и как у вас хз, нужно смотреть
    Опять же из тз, по умолчанию создавая юзера можно дать ему и домашнюю директорию и bash.
    НО если по тз именно через сед то да нужен файл /etc/passwd с созданым юзером user_1
    опять же есть тонкости к примеру с тем же паролем в котором могут быть спец символы тогда прийдется костылитьч через eval +echo
    Ответ написан
  • Как пройтись по указанным директориям (по некоторым рекурсивно, по некоторым нет) и для файлов с определенным расширением произвести редактирование?

    find /home/bitrix/ext_www/shop.wildorchid.ru/{upload/resize_cache,upload/iblock/,local}/ -type f -regex ".*\(jpg\|jpeg\|JPG\|JPEG\)" -exec jpegoptim --preserve --preserve-perms --max=85 {} \;

    home/bitrix/ext_www/shop.wildorchid.ru/{upload/resize_cache,upload/iblock/,local}/
    поиск по конкретным директориям рекурсивно.
    -type f- только файлы
    -regex ".*\(jpg\|jpeg\|JPG\|JPEG\)" - ну думаю тут и так понятно (более расширенный синтаксис)
    -exec - встроенная функция файнд, выполнить с найденым массивом, по факту это цикл с выводом массива
    поиска.
    jpegoptim --preserve --preserve-perms --max=85 {} \;
    Собственно массив файлов передается в exec тот в свою очередь запускет jpegoptim с параметрами, где {} собственно сам массив файлов.

    В результате этого скрипта на этих файлах будет применена оптимизация
    в вашем случае просто переименуйте или что там вам нужно.
    Отдельно обращу внимание что по факту на exec поступает каждая строка по отдельности а не кучей аргументов.
    То есть если будет найдено 10 файлов то 10 раз выполнится экзек, а не 1 с 10 аргументами.
    если вам нужно последнее то это через xargs
    Ответ написан
    Комментировать
  • Как поправить find запрос?

    find /home/bitrix/ext_www/shop.wildorchid.ru/{upload/resize_cache,upload/iblock/,local}/
    Ответ написан
  • Как присвоить переменную в BASH цикле?

    goo=${$i |cut -f1-1 -d":" }
    Ответ написан
    Комментировать
  • Как скопировать несколько файлов scp?

    shambler81
    @shambler81 Куратор тега Linux
    mkdir /tmp/11

    Теперь все что нам остается на сервере с которого мы копируем выполнить 1 команду.
    tar cvfz - /home/bitrix/ext_www/site.ru.ru/upload/mail/ |ssh root@11.111.111.11 "cd /tmp/11;tar xvfz -"

    сожмет все в 1 файл и отдаст его в потоке на тот сервер, распаковывая его
    Ответ написан
    Комментировать
  • Как автоматизировать перемещение файлов с условиями?

    как-то так ?
    Создаем папочку для бэкапа
    mkdir /tmp/backup

    find /home/bitrix/ext_www/shop.ru/  -mtime  -30 -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)" -print0 | xargs -0 cp --parents --target-directory /tmp/backup


    find - рекурсивный поиск
    /home/bitrix/ext_www/shop.ru/- откуда искать
    -mtime -30 - те что созданы за последние 30 дней значения могу принимать и плюсовые значении.
    -regexpне обязательно просто показал если нужны только определенные фацлы
    -print 0 тебе не особо нужно, но если у тебя там не просто файлы а структура каталогов со вложениями то через принт мы передаем в xargs короче нормально создадутся все каталоги
    xargx - долго ольяснять
    |- передать в
    cp --parents --target-directoryкопирует создавая дирекорию
    /tmp/backupдиректория собственно.

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

    УДАЛЕНИЕ
    find /tmp/backup -mtime +90 | xargs rm -f;
    #удаляет предыдущие бэкапы старше 90 дней
    Ответ написан
    Комментировать
  • Как найти все строки во всех файлах с такими параметрами?

    shambler81
    @shambler81 Куратор тега Linux
    1. текстовый файл или html ?
    2. пример файла в студию.
    Ответ написан