Ответы пользователя по тегу Командная строка
  • Как проверить что findstr возвращает не пустое значение?

    saboteur_kiev
    @saboteur_kiev Куратор тега Системное администрирование
    software engineer
    findstr lection todo.txt
    IF %ERRORLEVEL% EQU 0 (echo String found
    ) else (echo String not found)
    Ответ написан
    Комментировать
  • Как вывести stderr после echo?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    ERR=$(ping 8.8.8.8 -c 5 2>&1 >/dev/null   ) && echo "OK" || { echo "FAILED: ${ERR}" && exit; }


    но нужно помнить, что timeout для ping это не stderr
    Ответ написан
  • Почему не срабатывает /dev/null в первой команде?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Потому что у вас перенаправление идет только на apt dist-upgrade
    Ответ написан
    Комментировать
  • Как сделать сообщение об ошибке в Bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    apt -y install $1 > /dev/null 2>&1
    error_checking

    Вот эту часть оберните в цикл до трех, с паузой. Если все три раза неудачные - то выход с ошибкой.
    Ответ написан
    Комментировать
  • Как выполнить shell-команду из php по ssh и вернуть ее результат?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    1. ssh user@95.1.1.95
    Чтобы сразу соединить с пунктом 4 - пользуйтесь rsh или remsh - выполнить одну команду на удаленном сервере
    rsh user@95.1.1.95 "asterisk -rv 'sip show registry'"

    2. password
    Вот это не нужно, настройте авторизацию по ssh ключам, чтобы было и безопаснее и вводить пароль вручную было не нужно.

    3. asterisk -rv 'sip show registry'
    через rsh или remsh

    4. Закрываем ssh
    через rsh или remsh

    Возвращаем значение
    $result=exec("rsh user@95.1.1.95 \"asterisk -rv 'sip show registry'\"");
    print "$result"
    Ответ написан
    Комментировать
  • Анимация в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    вместо clear попробуйте использовать "tput cup $y 0", а clear сделать только при смене направления.
    Также можно сократить вычисления, высчитывая двиг слева только при движении влево и вправо.
    И использовать индексы, вместо преобразования имени переменной.
    И как-то у вас все не-аккуратненько. Мышка кривая, вы бы ее подрисовали ровнее, как-то так:

    spoiler
    #!/bin/bash
    
    let y=0
    let x=0
    let max_x=120 #$(tput cols)
    let max_y=24
    let wall=0
    let space=""
    
    draw_top() {
        local line[0]='   ###               ###'
        local line[1]='  #####   ## | ##   #####'
        local line[2]='########################### '
        local line[3]='  #######################  '
        local line[4]='     #################   '
        local line[5]='          #######     '
        local line[6]='           ##### '
        local line[7]='             #  '
        local line[8]='              '
    
        for index in {0..8}; do
            echo "$space${line[$index]}"
        done
    }
    
    draw_bottom() { 
        local line[0]='              '
        local line[1]='             #  '
        local line[2]='           ##### '
        local line[3]='          #######     '
        local line[4]='     #################   '
        local line[5]='  #######################  '
        local line[6]='###########################'
        local line[7]='  #####   ## | ##   #####'
        local line[8]='   ###               ###'
    
        for index in {0..8}; do
            echo "$space${line[$index]}"
        done
    }
    
    draw_right() {
        local  line[0]='          #   '
        local  line[1]='          ##  '
        local  line[2]='         #### '
        local  line[3]='       #######'
        local  line[4]='     ######## '
        local  line[5]='     #######  '
        local  line[6]='     ######   '
        local  line[7]='  ##########  '
        local  line[8]='###########-  '
        local  line[9]='  ##########  '
        local line[10]='     ######   '
        local line[11]='     #######  '
        local line[12]='       #######'
        local line[13]='         #### '
        local line[14]='          ##  '
        local line[15]='          #   '
    
        # Вычисляем сдвиг слева
        space=""
        for ((j = 0; j < $2; j++)) ; do
          space="$space "
        done
        for index in {0..15}; do
            echo "$space${line[$index]}"
        done
    }
    
    draw_left() {
        local  line[0]='   # '
        local  line[1]='  ## '
        local  line[2]=' #### '
        local  line[3]='####### '
        local  line[4]=' ######## '
        local  line[5]='  ####### '
        local  line[6]='   ###### '
        local  line[7]='  ########## '
        local  line[8]=' -########### '
        local  line[9]='  ########## '
        local line[10]='   ###### '
        local line[11]='  ####### '
        local line[12]='####### '
        local line[13]=' #### '
        local line[14]='  ## '
        local line[15]='   # '
    
        # Вычисляем сдвиг слева
        space=""
        for ((j = 0; j < $2; j++)) ; do
          space="$space "
        done
        for index in {0..15}; do
            echo "$space${line[$index]}"
        done
    }
    
    move_right() {
        if ((x < max_x - 15))
        then
            ((x++))
        else
            wall=1
        fi
    
        tput cup $y 0
        draw_right $y $x
    }
    
    move_bottom() {
        if ((y < max_y - 8))
        then
            ((y++))
        else
            wall=1
        fi
        
        tput cup $y 0
        draw_bottom $y $x
    }
    
    move_left() {
        if (( x > 0 ))
        then
            ((x--))
        else
            wall=1
        fi
    
        tput cup $y 0
        draw_left $y $x
    }
    
    move_top() {
        if (( y > 0 ))
        then
            ((y--))
        else
            wall=1
        fi
    
        tput cup $y 0
        draw_top $y $x
    }
    
    random_choice() {
        RANGE=$1
        number=$RANDOM
        let "number %= $RANGE"
        echo "$number"
    }
    
    move() {
        if [ "$1" == 0 ]
        then
            move_right
        fi
    
        if [ "$1" == 1 ]
        then
            move_left
        fi
    
        if [ "$1" == 2 ]
        then
            move_top
        fi
    
        if [ "$1" == 3 ]
        then
            move_bottom
        fi
    }
    
    calculate_coords() {
        let vertical=$1
    
        # Вертикально -> Горизонтально
        if (( vertical > 0))
        then
            x=$((x-8))
            y=$((y+5))
    
            if (( x < 0 ))
            then
                x=0
            fi
    
            if (( x + 31 > max_x))
            then
                x=$((max_x-31))
            fi
    
            if (( y + 8 > max_y))
            then
                y=$((max_y-8))
            fi
    
        # Горизонтально -> Вертикально
        else
            x=$((x+8))
            y=$((y-5))
    
            if (( y < 0 ))
            then
                y=0
            fi
    
            if ((x + 13 > max_x))
            then
                x=$((max_x - 13))
            fi
    
            if ((y + 17 > max_y))
            then
                y=$((max_y - 17))
            fi
        fi
    }
    
    start() {
        current=0
        direction=0
        prevent_direction=0
        clear
    
        while true; do
            # Calculate dicrection
            if ((current == 20 || wall == 1))
            then
                wall=0
                current=0
                prevent_direction=$direction
                direction=$(random_choice 4)
    
                if (( direction < 2 && prevent_direction > 1 ))
                then
                    calculate_coords 0
                fi
    
                if (( direction > 1 && prevent_direction < 2 ))
                then
                    calculate_coords 1
                fi
                clear
            fi
    
            # Move
            move $direction
            current=$((current+1))
            /bin/sleep .05
        done
    }
    
    start
    Ответ написан
    Комментировать
  • Linux shell: как удалить файлы, старше определённой даты?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    find /path/to/files/* -mtime +1 -delete

    При этом нюанс
    -mtime +1
    модифицированные больше 1 дня назад

    -mtime 1
    модифицированные один день назад (сегодня и позавчера уже не затронет)

    вместо -delete можете для начала ничего не писать, он выдаст на экран что найдет, чтобы убедиться что все ок.
    Ответ написан
    Комментировать
  • Как найти несколько слов в нескольких файлах при помощи BASH?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Вообще-то это делается в одну команду:

    grep -r -P "(hulk|hogan|dolph|ziggler)" *.txt
    Ответ написан
    Комментировать
  • Как сделать автоматическую выгрузку файлов на фтп скриптом?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Почему бы не использовать scp/rsync?
    ftp протокол небезопасный, логины и пароли в открытом виде шлет через все.
    Я бы рекомендовал перейти на ssh/sftp. А там и инструментов для аплоада побольше.
    Ответ написан
    4 комментария
  • Как выдать права пользователю через скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    добавить chmod с нужными правами?
    man chmod
    man chown
    man stat

    # получаем юзернейм овнера для текущей папки "."
    OWNER_USER=`stat -c %U .` 
    # получаем групнейм группы для текущей папки "."
    OWNER_GROUP=`stat -c %G .`
    # проставляем владельца и группу
    chown ${OWNER_USER}:${OWNER_GROUP} file
    # проставляем права доступа 771
    chmod 771 file
    Ответ написан
    8 комментариев
  • Как поправить shell скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Зачем вам нужен sudo для создания файла и запуска питона?
    Если нужен sudo - запускайте весь скрипт, то есть:

    #!/bin/sh
    
    OUTFILE="/home/folder/logs/log_$(date +"%d-%m-%Y-%H-%m").txt"
    cd /home/folder/logs
    python3 handleMouseEvent.py > ${OUTFILE}


    и затем
    sudo myscript.sh

    Во-вторых, вы делаете перенаправление > а перед этим делаете touch - зачем? перенаправление и так создаст нужный вам файл. Главное, чтобы у юзера, от которого вы запускаете (при sudo - у рута) были права записи в указанной папке.

    P.S. В шелл принято именовать переменные в верхнем регистре.
    Ответ написан
    Комментировать
  • Как остановить вывод команды через BASH?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Что за команда?
    Вариант 1: посмотреть справку к этой команде - очень много команд предоставляют варианты выхода после вывода n результатов, например ping, который по дефолту пишет пока не прервешь.

    Вариант 2: запустить ее в фоне, сделать паузу в несколько секунд и убить,например

    mycommand &; sleep 5; killall mycommand

    Вариант 3: mycommand | head -<строк>
    Ответ написан
    Комментировать
  • На чем и как лучше написать скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Можно написать на ЛЮБОМ скриптовом языке и очень быстро.
    perl/php/python/js/bash.
    Главное, чтобы вы умели хоть немного писать.
    Ответ написан
    Комментировать
  • Как скопировать файл с windows на ubuntu скриптом не по ssh?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    pywinrm не копирует файлы, он выполняет удаленные команды.
    Передавать файлы нужно либо тремя общепринятыми способами:
    ssh (scp, rsync)
    ftp
    samba

    Либо пишите свой велосипед-сервис, для передачи файлов.
    В качестве варианта, можно попробовать какие-нить облачные сервисы, типа googledrive, для которых есть клиенты и под линукс и под виндовс.
    Ответ написан
    Комментировать
  • Как в консоли сделать замену подстрок в Linux?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Предположим, у вас есть файл test.txt с указанным текстом, тогда

    sed -r "2,3s/(.*)/\/\/\1/g" test.txt

    Расшифровка:
    берем текст между 2,3 строками - .*
    Заключаем его в скобки (.*) - теперь мы можем его вызвать через back reference \1
    добавляем два экранированных слеша и бэкреференс \/\/\1

    если нужно изменить сам файл - в вызов sed добавить sed -i
    Ответ написан
  • Какие есть подводные камни в такой bash инструкции?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    замените "xargs rm -r" на "xargs echo rm -r" и проверьте.

    Какая стоит задача?

    Пока что задача стоит странно:
    Удалять все каталоги в /var/www, которые старше 1 дня, но моложе 3 дней, оставляя при этом один рандомный каталог (поскольку сортировка вывода не стоит, и какой именно каталог будет пропущен неявно будет определяться по тому, что первым найдет find)?

    Если просто удалить все, что старше 1 дня, то может вот так:
    PROJECT_PATH="/var/www/project1"
    find $PROJECT_PATH -mtime +1 -delete
    Ответ написан
    2 комментария
  • Почему юнит-тесты PHP запускают из командной строки?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    "Где-то я читал про "зелёные полоску", которая показывать процент пройденных тестов, это ведь в браузере только можно сделать - красивый отчет о тестах?"

    Юнит тесты, выполняющиеся из консоли, легко могут сами по себе генерировать красивый html отчет, даже с ajax, который вы будете смотреть из браузера.

    У вас какой-то мусор в терминологии и представлении как все работает.

    Браузер - НЕ УМЕЕТ выполнять php скрипты. Браузер умеет парсить html и выполнять javascript из него. Поэтому запускать php юнит тесты в браузере невозможно.

    Можно поставить какой-нить движок, типа teamcity/jenkins/hudson, в котором настроить джобы, и тогда их можно "запускать через браузер". Но для выполнения PHP скрипта, ему нужен php, а не браузер.
    Ответ написан
    Комментировать
  • BASH. Как задать разные привилегии для разных групп (команда chmod)?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    в POSIX файловых системах, только один владелец, только одна группа

    Но вы можете группе teachers дать права на запись, а всем остальным - на чтение
    Ответ написан
  • Почему обнуляется переменная заданная внутри цикла (bash скрипт)?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Вы вызываете внешнюю команду cat с конвейером "|", и все что идет в блоке после конвейера - будет работать в отдельной оболочке. Отсюда "echo 1 freePipe" будет выводить внутреннюю переменную процесса cat, а не вашего цикла.

    Да, а чтобы закончить цикл, пользуйтесь exit или break.
    Команда break может иметь аргумент, чтобы закончить цикл определенной вложенности.
    например

    while true
    do
       while true
       do
          while true
          do
             break 2
             echo 3
          done
          echo 2
       done
       echo 1
    done


    будет выводить только 1, потому что break выйдет из двух вложенных циклов, оставшись в третьем (то есть самом внешнем)
    Ответ написан
    2 комментария
  • Как сделать автоматический вход при перезагрузке по скрипту на винде?

    saboteur_kiev
    @saboteur_kiev Куратор тега Windows
    software engineer
    Можете прописать юзера и пароль в реестре.
    HKLM\Software\Microsoft\Windows NT\CurrentVersion\winlogon
    AutoAdminLogon = "1"
    DefaultUserName = "user"
    DefaultPassword = "pass"

    Если комп в домене - добавить еще
    DefaultDomainName = "domain"

    Сохраните файлы реестра для нескольких юзеров, и перед перезагрузкой применяйте нужный через
    regedit -s
    Ответ написан
    3 комментария