В этой статье я опишу ряд функциональных, полезных, а порой и опасных команд, чтобы продемонстрировать потенциал использования оболочки Bash в Linux.Некоторые из них, действительно, потребуют соблюдения осторожности, так как иначе можно потерять все свои данные. Другие же, наоборот, окажутся очень покладистыми и полезными для повышения эффективности работы.

Приступим!

Опасные команды


Выполняйте их, только если уверены в своих действиях. Я добавил в начало и конец каждой символы - -, чтобы их нельзя было просто скопировать и вставить.

1. fork-бомба


Эта «команда» при выполнении на ПК не представляет особой угрозы, но вот ее запуск на сервере может привести к отказу в обслуживании.

Выглядит она как странный набор символов, хотя на деле это реальное определение функции bash.

В bash допускается использовать в качестве имени функции :. И в случае выполнения команды :(){ :|:& };: именно такую функцию мы и создаем. Внутренне она рекурсивно вызывает сама себя, то есть выполняется бесконечно, а с помощью & мы инструктируем процесс выполняться фоново.

$ -- :(){ :|: & };: --

2. Прямая запись на жесткий диск


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

$ -- "a command" > /dev/sda --

Запись на диск случайных данных
Эта команда может пригодиться, например, для перезаписи секторов диска с целью исключения возможности восстановления данных. Напомню, что при наличии правильного инструмента вернуть данные после форматирования диска трудностей не составит.

Если использовать эту команду в цикле и выполнить ее 3-4 раза, то она в достаточной степени гарантирует невозможность восстановления удаленной информации.

$ -- dd if=/dev/urandom of=/dev/disk --
//for i in {1..10}; do dd if=/dev/urandom of=/dev/disk; done

3. Удалить все


Эта команда удаляет все, включая файлы на жестком диске и подключенных устройствах, что делает ее очень опасной, поскольку разрешения она не спрашивает.

С помощью флага rf мы инструктируем ее выполняться рекурсивно и удалять все файлы без запроса разрешения.

Символ / указывает, что начинать нужно с корневого каталога, который содержит все файлы и все смонтированные устройства с данными, включая удаленные файловые ресурсы и съемные диски. (прим. пер.: современные дистрибутивы не дают просто так удалить /, надо либо добавить --no-preserve-root, либо удалять /* (все файлы в корневом каталоге).

$ -- rm -rf / --

Регулярные команды


4. Определение самых используемых команд


Эта однострочная инструкция удобна, когда мы хотим узнать, какие команды чаще всего используем. С помощью -n X указывается количество, которое нужно вывести. Например, n -10 отобразит 10.

cat ~/.bash_history | tr "\|\;" "\n" | sed -e "s/^ //g" | cut -d " " -f 1 | sort | uniq -c | sort -n | tail -n 10



5. Вывод из файла списка уникальных слов


Следующая команда используется для вывода слов, содержащих символы алфавита. Данная инструкция tr преобразует все не алфавитные символы в символы новой строки, после чего команда sed эти пустые строки удаляет. В завершении с помощью sort выполняется уникальная сортировка результатов с исключением повторений.

tr -c a-zA-Z '\n' < someFile.txt  | sed '/^$/d' | sort | uniq -i -c

6. Выделение цветом вывода ps


Эта команда окрашивает вывод ps, показывая службы красным, а ведущие процессы сеанса зеленым.

Цвета Ascii: http://es.tldp.org/COMO-INSFLUG/COMOs/Bash-Prompt-Como/Bash-Prompt-Como-5.html

ps ajxf | awk '{ if($2 == $4) { if ($1 == 1) { print "\033[35m" $0"\033[0m"}  else print "\033[1;32m" $0"\033[0m" } else print $0 }'



7. Переход в предыдущий рабочий каталог


Суперполезная, но редко используемая команда. Если вам нужно вернуться в предыдущий каталог, просто выполните:

cd -

8. Комбинация Traceroute и ping


Эта команда сочетает в себе инструкции ping и traceroute, представляя диагностический инструмент, который непрерывно отправляет пакеты, отражая время выполнения каждого опроса.

mtr google.com



9. Поиск последней команды, начинающейся с “xxx”, без ее выполнения


В этом примере мы ищем первую команду, начинающуюся с «cp».

!cp:p



10. Выполнение команды N раз


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

for i in {1..10}; do command; done

11. Добавление часов в терминал


Выполнение следующих команд приведет к добавлению в терминал часов, которые останутся активны до его закрытия.

while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done & 



12. Поиск повторяющихся файлов


Удобный способ поиска дубликатов файлов, при котором команда получает и сравнивает их хэш-значения.

find -not -empty -type f -printf "%s
" |  sort -rn |  uniq -d |  xargs -I{} -n1  find -type f -size {}c -print0 |  xargs -0  md5sum |  sort |  uniq -w32 --all-repeated=separate

13. Установка звукового уведомления об активации IP-адреса


Эта инструкция пригождается во многих ситуациях. Например, она может давать звуковое оповещение при возвращении сервера в онлайн.

Флаг -i 120 указывает, сколько секунд ожидать между запросами.
Флаг -a включает звуковое уведомление при получении сервером пакета.

ping -i 120 -a IP_address

14. Удаление всех файлов каталога, не соответствующих заданному расширению


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

rm !(*.xls|*.slsx|*.csv)

15. Удалить все файлы, кроме одного


Эта команда аналогична предыдущей, но здесь мы обозначаем всего один файл, который нужно оставить.

rm -f !(theFile.txt)

16. Генерация случайного пароля заданной длины


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

Нужная длина при этом устанавливается флагом -c.

date +%s | sha256sum | base64 | head -c 8; echo

17. Рекурсивное удаление всех пустых каталогов


Находит и удаляет все пустые каталоги.

find . -type d -empty -delete

18. Копирование разрешений файла


Инструкция ниже скопирует для file1 все разрешения, установленные для file2.

chmod --reference file2 file1

▍Напоследок


Командная строка – удивительная вещь, с помощью которой можно выполнять невероятно много разных действий. Надеюсь, что статья оказалась для вас полезной, и благодарю за уделенное внимание!

Комментарии (48)


  1. Aelliari
    15.06.2022 16:13
    +17

    date +%s | sha256sum | base64 | head -c 8; echo

    И что в этом пароле случайного?


    1. dlinyj
      15.06.2022 16:21
      +2

      dd if=/dev/urandom bs=1 count=10 2>/dev/null | base64
      dUsF7BcA8QgQYw==


      1. dlinyj
        15.06.2022 16:25
        +2

        Можно ещё head и echo добавить, чтобы убрать равно и добавить перевод каретки.

         dd if=/dev/urandom bs=1 count=10 2>/dev/null | base64 | head -c 8;echo
        rj9+C0bm
        


        1. 0xd34df00d
          15.06.2022 18:55
          +9

          Вы же всё равно делаете head -c, зачем тут dd? Можно просто cat /dev/urandom | base64 | head -c N — я лично так пароли и генерирую.


          1. dlinyj
            15.06.2022 19:09

            Да я сначала с dd сделал, а потом обратил внимание на равно. Ваш вариант более элегантен и прост.


          1. DistortNeo
            15.06.2022 20:45
            +3

            Я предпочитаю такой вариант как более smartphone friendly:

            cat /dev/urandom | tr -dc a-z0-9 | head -c 10; echo
            

            Набирать 10-символьный пароль из букв в нижнем регистре и цифр сильно быстрее, чем 8-символьный из букв разного регистра, цифр и спецсимволов, а комбинаций больше 36¹⁰ > 64⁸.


            1. 0xd34df00d
              15.06.2022 20:50
              +1

              Только вы так больше энтропии поедаете (хотя я всегда путаю /dev/random и /dev/urandom, так что могу быть неправ), выкидывая большую часть битов.


              Хотя, наверное, на практике это всё неважно.


              1. DistortNeo
                15.06.2022 21:15
                +3

                На практике это не важно.
                https://habr.com/ru/company/vk/blog/273147/


          1. Hamper
            16.06.2022 15:37
            +1

            Кстати cat в вашем случае бесполезен полностью, можно еще сократить: base64 /dev/urandom | head -c N


    1. pav5000
      15.06.2022 20:39
      +6

      Тоже хотел написать, что это очень вредная команда. Лучше использовать команду apg, она все-таки делалась специально для генерации паролей.


    1. vanyas
      15.06.2022 22:11
      +6

      Да и есть же pwgen


      1. SakhalinDDF
        16.06.2022 06:14
        +1

        уже на автомате открываю терминал и набираю нечто подобное, когда надо "придумать новый пароль к новому уникальному сервису"

        pwgen -y 24 1


      1. Ddnn
        16.06.2022 19:31

        Да и openssl rand -base64 10 тоже вполне себе работает, причем зачастую из коробки уже установлено...


  1. BrSlava
    15.06.2022 17:44
    +1

    хм. а все ли bash?

    [root@noname-hp:/mnt/c/temp] > mtr google.com
    -bash: mtr: command not found


    1. dlinyj
      15.06.2022 18:25
      +1

      pi@raspberrypi:~ $ mtr
      -bash: mtr: command not found
      pi@raspberrypi:~ $ sudo apt install mtr -y
      ...
      mtr google.com



  1. cepera_ang
    15.06.2022 18:06
    +83

    18 случайных команд в терминале для выполнения плана по постам в корпоративный блог.


    1. theGrove
      16.06.2022 10:06
      +1

      Сильно!!


  1. sav13
    15.06.2022 18:52
    +6

    А причем здесь bash?
    Что в других оболочках эти команды не работают?


    1. Bright_Translate Автор
      15.06.2022 19:43

      Да, вы правильно подметили. Исправил название. Просто пример приведен именно с Bash


    1. Ritan
      15.06.2022 20:03
      +1

      Ну 14 и 15 точно башизмы. Ни в sh ни в других оболочках это не работает


      1. UnknownErrror
        15.06.2022 21:12

        В zsh с включённым KSH_GLOB очень даже работает


        1. Ritan
          16.06.2022 02:13

          Ну так zsh прикладывал усилия, чтобы оставаться совместимыми с башем, так что неудивительно. В том же fish( который, впрочем, вообще не posix-compliant) работает всё, кроме этих двух примеров


  1. Akina
    15.06.2022 20:36
    +4

    Напомню, что при наличии правильного инструмента вернуть данные после форматирования диска трудностей не составит.

    Сказки.

    Такие инструменты, вероятно, существовали для древних MFM-дисков (впрочем, достоверно подтверждённых фактов восстановления мне лично не попадалось, равно как и сообщений о них - только не заслуживающие доверия сообщения типа "а вот у спецслужб..."). Но на более-менее современных накопителях это совершенно нереально.


    1. nochkin
      15.06.2022 21:41
      +3

      После обычного форматирования как раз восстановить не проблема. Речь не про низкоуровневое форматирования или перезапись всех секторов.

      На SSD есть нюансы из-за trim'ов всяких, а на обычном механическом диске это вообще не проблема.

      Сам несколько раз восстанавливал.


      1. Aelliari
        16.06.2022 01:02

        На ссд вообще все сложно, контроллер живёт своей жизнью и в общем то часто плевать хотел на ОС, но соглашается с явными штатными командами. Он может как грохуть данные помеченные как "удаленные", так и посчитать что ячейки устали, и заменить их резервной областью оставив данные на месте. Благодаря чему данные фактически неуничтожимы. Благо в современных ссд все больше аппаратного шифрования, что с высокой долей вероятности все равно не позволит получить доступ к данным, на ячейках от которых контроллер отказался


        1. nochkin
          16.06.2022 02:22
          +1

          Это никак не противоречит с моим утверждением выше о возможности восстановления данных не только со старых MFM-дисков, но с обычных современных в том числе вне зависимости от их объёма и технологии хранения.


          1. Aelliari
            16.06.2022 08:13
            +1

            Так я ведь и не пытался противоречить. Только указал, что с ssd может выйти так что данные никогда не будут удалены, несмотря на любые команды (правда и доступ к ним получить может не получиться). А если там нет аппаратного шифрования - то всегда можно попробовать и прямой доступ к нанд. Или наоборот, "умный" контроллер может прогнать trim в любой момент лишив надежды на восстановление


      1. Akina
        16.06.2022 07:40

        После обычного форматирования как раз восстановить не проблема.

        Зависит от того, как выполняется форматирование. Оно может как просто перезаписывать служебные структуры тома "чистыми" (причём как полностью, так и "по минимуму"), так и перезаписывать (типа для проверки) часть или даже все секторы тома. В первом случае да, как правило, процент восстановления достаточно высок, и для большинства современных ФС даже может составить 100%. Во втором - те файлы, в которые попали "плевки" тестовой записи - невосстановимы.

        Речь не про низкоуровневое форматирования или перезапись всех секторов.

        Вообще-то в статье речь о прямой записи на диск безотносительно к имеющимся дисковым структурам. Всё, что попадёт под эту запись - невосстановимо. Всё, восстановление чего зависит от структур, хранившихся в перезаписанных секторах. восстановимо только эвристически (реконструкция на основании неповреждённых данных).

        Низкоуровневое форматирование на современных накопителях обычному пользователю, как правило, недоступно.


        1. nochkin
          16.06.2022 08:11
          +1

          Мы оба прекрасно понимаем о каком простом форматировании идёт речь. Зачем это размазывание манной каши по стенам?

          В статье достаточно понятно было сказано какое форматирование и даже что именно надо сделать что бы восстановить было нереально.

          И низкоуровневое форматирование вполне доступно пользователю.


      1. mpa4b
        16.06.2022 19:18

        На SMR дисках тоже fstrim/blkdiscard работает. Ну, на некоторых по крайней мере.


    1. Aelliari
      16.06.2022 01:08

      Зависит от того КАК были потеряны данные. В конце концов можно и с помощью АСМ читать блин жесткого диска. Только вот это совсем феерический способ себя задрочить без грантий на хоть какой то результат, особенно с учётом того, что позиционирование головки в современном жестком диске - очень неплохое. Но если просто грохнули фс/разметку, шансы вернуть данные - вполне есть, может конечно и не все... А вот после перезаписи - малореально


      1. nochkin
        16.06.2022 02:24
        +1

        Речь не про "потеряны", а про обычное форматирование. В статье про "потеряно" не было сказано.

        Потому и про перезапись в статье написано, так как именно после перезаписи данные никакими простыми способами уже не вернуть. А иначе после форматирования можно восстановить.


        1. Aelliari
          16.06.2022 08:16

          В моем комментарии "потеряно" несёт смысл том числе и форматирование, как подмножество для "потеряно"


    1. MaxLK
      16.06.2022 11:54

      софт элементарно гуглился по слову unformat. на винде работало. правда бесплатным ПО не всегда удавалось все полностью корректно восстановить, но обычно все было и не обязательно. быстрый формат зачищает только таблицы, сами данные остаются. FAT вообще можно было руками руками восстановить. и вообще восстановление больше зависит от файловой системы, а не от интерфейса накопителя.


      1. Akina
        16.06.2022 14:55

        быстрый формат зачищает только таблицы, сами данные остаются.

        Ну-ну... Вы поэкспериментируйте.

        Создайте том. Заполните его все секторы данных рандомом. Потом выполните быстрое форматирование. А потом поищите и посчитайте в области данных секторы, заполненные нулями. Так вот - любой файл, на тело которого приходится такой сектор - невосстановимый труп.


  1. SergeiMinaev
    15.06.2022 22:29
    +2

    cd -

    А для перехода в домашний каталог можно использовать cd без аргументов.


    1. oco
      16.06.2022 16:32
      +1

      `git checkout -` - перейти на предыдущую ветку


  1. Devakant
    15.06.2022 23:49
    +1

    Переход в предыдущий рабочий каталог

    "cd -" по факту как бы шаг назад, при этом если в предыдущем каталоге использовать эту команду, вернетесь обратно в текущий с которого начали.
    Эффективней мне кажется использовать "cd .." - что позволяет переходить каждый раз на шаг назад вплоть до рута.


    1. zlat_zlat
      16.06.2022 07:30
      +4

      Но ведь это разные вещи. Переключаться между условно /tmp и /home/username/testdata по очереди - очень удобно именно с cd - .


      1. Devakant
        16.06.2022 10:17

        Я согласен, но тогда нужно внести пояснение или дополнение, т.к. повторюсь cd - просто переключает между двумя последними директориями, а cd .. возвращает на директорию выше.


        1. cepera_ang
          16.06.2022 11:21

          Открытие autojump, fasd или z вообще наверное будет шоком :)


  1. Ensay
    16.06.2022 07:38
    +1

    Про вывод даты/время в 11 примере. Если повторно запустить команду, но немного изменив date, например на date -u, то на экране получится чередование форматов дат раз в секунду. Полезность сомнительная, но забавно. :)


  1. 13werwolf13
    16.06.2022 09:37
    +1

    по двум строкам

    $ -- dd if=/dev/urandom of=/dev/disk --

    и

    $ -- "a command" > /dev/sda --

    есть претензия. принято символом $ обозначать команды выполненные НЕ от привелигированного пользователя, тогда как символ # для привелегированного, в таком случае приведённые команды НЕ опасны.

    а вот

    $ -- rm -rf / --

    это уже из истории так как в современных дистрибутивах уже свежая версия rm которая имеет защиту от долдурака, и чтобы удалить рекурсивно всё от корня требуется ещё один флаг, емнип что-то вроде --no-preserve-root.

    остальные претензии уже высказали до меня выше.


  1. 13werwolf13
    16.06.2022 09:45
    +3

    Для тех кто пришёл сюда в поисках интересных команд думаю стоит оставить вот эту ссылку. Там такого много.


  1. Blacker
    16.06.2022 13:51
    +1

    Генерация случайного пароля заданной длины

    openssl rand -hex 4

    (4 байта — 8 hex-символов)


  1. FFiX
    16.06.2022 19:51
    +1

    /dev/urandom достаточно ресурсоемкая штука, так что выполнение

    dd if=/dev/urandom of=/dev/disk

    Будет очень медленным. Есть разные модули для ядра (frandom, например), которые позволяют делать это без ощутимой нагрузки на процессор.

    Есть специальные утилиты, которые зачищают диск на полной скорости носителя. Как вариант, можно взять random generator из openssl.

    Стоит так же учитывать, что на современных носителях есть более эффективные и быстрые способы очистки.

    А еще, размер блока у dd по умолчанию 512 байт. Это еще одна причина, почему подобная команда будет излишне грузить cpu.


    1. dlinyj
      16.06.2022 21:55

      dd if=/dev/urandom of=/dev/disk bs=4M


      1. FFiX
        16.06.2022 22:10
        +2

        Это поможет только с последним, копирование всё равно скорее всего упрётся в генератор случайных чисел. Особенно, если накопитель быстрый