хостинг linux

Выполнение произвольных команд

Это часто бывает полезно выполнить определенную команду (или команд) на соответствие Файлы открытые найти. Вы можете использовать опцию "-Exec" действия для этого. Вот пара простой (но полезное) Примеры: Найти / TMP-MTIME 7-Exec RM-RF () \; Найти / VAR / Log-MTIME 7-Exec GZIP () \; Синтаксис-Exec немного странно. После-Exec, вы указываете в командной строке вы хотите запустить, но вы использовать фигурные скобки ("{}") чтобы указать, где в командной строке, вы хотите Найти, чтобы заменить соответствующие имена файлов. Команда после Exec должно быть прекращается с "\;" (это возможно, что вы, возможно, другие действия или выражения, после -- Exec, хотя обычно "\;" это последнее, что на линии). Например, на слайде полезно немного выражения для отображения названий файлов, содержать конкретную строку, я часто использую эту возможность для поиска каталогов с исходным кодом конкретному объекту. Обычно, конечно, Grep проявить совпадающие строки, но "Grep -L "означает команду" отображать только имена файлов ". 16 linux хостинг 17 Повышение эффективности Выясняется, что сначала найти пример на слайде довольно неэффективно, потому что найти в конечном итоге работает Grep на каждом отдельном файле, который кучу отдельно казней Grep. Вместо этого, вы можете подумать трубопроводов выходе "найти ... -- Печать "в xargs программы. xargs поглощает имена файлов из своего стандартного ввода и использует их, чтобы построить и выполнить команду строк при условии, встроенных в список аргументов длина ограничений в оболочке. Результатом является то, что Grep команда будет конца до выполняется много раз меньше, xargs, чем он будет с командой найти. Вы можете увидеть увеличение производительности с использованием встроенных в "Time" функции в оболочке, это полезно для быстрого критериев делать так: # Время найти / USR / включить типа F \ Grep-Exec-L PATH_MAX () \;> / Dev / NULL реальный 0m11.488s Пользователь 0m1.570s SYS 0m10.732s # Время найти / USR / включить типа F-печать | \ xargs Grep-L PATH_MAX> / Dev / NULL реальный 0m0.300s Пользователь 0m0.076s SYS 0m0.270s Что интересно, для меня является то, что "найти ... | xargs ..." Пример действительно представляется быть немного быстрее, чем "Grep-RL ...": # Время Grep-RL PATH_MAX / USR / включать> / Dev / NULL реальный 0m0.437s Пользователь 0m0.074s SYS 0m0.345s Конечно, не все версии Unix судно с Grep команда, которая поддерживает "-R" опции все равно ... 17 linux хостинг 18 я в `след-З 1 12`; делать MKDIR-P / Архив / Журналы / $ I готово Loops для файла в формате *. GZ; делать Эхо ===== $ файла ZCAT $ файл | Grep Foo готово а:; делать Netstat в систему | Grep eth0 сон 5 готово Loop конструктов Найти программу существенно interator над каталогами файлов, но иногда вы нуждаются в более общем построить цикл. Баш на самом деле имеет несколько различных типов петель доступны, но мы будем просто обсуждать пару из них. Наиболее распространенный тип цикла я нахожусь делать в командной строке это "FOREACH" Тип цикле, который обрабатывает список имен файлов и других ценностей. Как вы можете видеть на первом Например, вы можете использовать оболочку шариков Wildcard для создания списков имен файлов для обработки. Этот первый Пример идиома я часто используемых для поиска конкретной строки в коллекциях сжатый / сжатыми файлами. Эхо заявлением выходов легко узнаваем заголовке до соответствия выходе из каждого файла, так что легко увидеть, какой файл (ы) матчи возникать дюйма Во втором примере мы используем след команду, чтобы создать список числовых значений от 01 до 12 ( "-W" опция заставляет далее производить соответствуют ширине ценностей, нулевой заполнения в случае необходимости). Затем мы используем, чтобы заменить обратные кавычки выходе далее как список значений в нашем цикле 18 linux хостинг 19 Фактически, Bash имеет С-стиля для петлю, чтобы мы могли делать это без следа: для ((i = 0; $ i <= 12; я ++)); делать MKDIR-P / Архив / Журналы / `Е% 02d $ I` готово Честно говоря, я думаю, что вариант с последующими в обратные кавычки много яснее, но Ваша оценка может варьироваться. Просто завязать бантом на этой дискуссии, я хотел бы отметить, что это действительно довольно бедные Пример поскольку вы можете сделать это без цикла на всех: MKDIR-P / Архив / журналы CD / Архив / журналы MKDIR `след-W 1` 12 Иногда бесконечные циклы, являются полезными. Последний пример показывает, идиома, что я часто используемых Когда я хочу, чтобы следить за вывод команды на регулярной основе в течение длительного периода время. Например, предположим, что вы хотели посмотреть, сколько трафика идет из ваших Ethernet-интерфейс. Вы можете использовать последнюю петлю на слайде, чтобы посмотреть Netstat выходной для этого интерфейса на пять секунд. 19 linux хостинг 20 Развлечения с головой и хвостом Смотрите первые / последние несколько строк файла: голова -50 / ETC / Passwd Хвост -50 / VAR / вход / Secure Хвост 30 / ETC / Passwd Новые файлы в директории: LS-T | голову -1 Новейшие файле, долгое листинг (2 й строки): LS-LT | голову -2 | хвоста 1 И, конечно же, "хвост-Р" является полезной для лог-файлов ... голову и хвост Иногда бывает полезно взглянуть на только первые несколько (голова) или последние несколько (хвост) линий файл. Или вы можете перенаправить вывод команды в голову или хвост по мере необходимости. Это Часто значительное улучшение производительности, поскольку строки, которые вы не смотрите на может быть отбрасываются, вместо того, которое будет отображаться в окне терминала. По умолчанию, голова и хвост вернется 10 видов продукции, но как вы можете видеть из первых несколько примеров можно указать более или менее линия продукции, чем по умолчанию. Вообще-то, Хвост позволяет указать, либо - получить последние строк файла или + пропустить первой линии и отображения остальных. "LS-T | голову -1" является полезным языком для получения последних измененных файлов в каталоге ( "LS-T" сортирует Ls продукции на MTIME). Следующий пример показывает, как можно Труба "голова - " в "хвосте -1", чтобы извлечь й линии выхода в данном случае Вторая линия выхода из "LS-LT", которая является подробным перечнем за последний измененных файлов в каталоге (первая строка вывода заголовков). Собственно, это плохо Например, поскольку проще получить ту же информацию будут использовать "-R" возможность Ls и вывода списка файлов в обратном порядке, а затем просто использовать "LS-LRT | Хвост -1 ". 20 linux хостинг 21 "хвост-Р" является полезной для просмотра файлов журнала растущие как он будет постоянно следить за конец файла и отображения новых линий по мере их добавления в файл (остановить программу попадания -C в любое время). Версия GNU хвоста действительно достаточно умны, чтобы определить, когда файл журнала была повернута и перехода к новому файлу журнала, но Версия хвост на взрослых, проприетарных систем Unix могут не иметь этой возможности. 21 linux хостинг 22 Cut против AWK Cut хорошо работает для сильно разделителями данных: Cut-f1, 5-D: / и т.д. / Passwd AWK лучше работает для произвольного разделенных пробелами данные: PS-EF | AWK '(PRINT $ 2)' Cut против AWK Это часто полезно вывести частности поля из строк ввода, и наиболее распространенных инструменты командной строки для этого в Unix вырезаны и AWK. разрезе наиболее полезна, когда Данные, которые вы имеете дело с сильно разделителями, как и в / ETC / Passwd файла, в котором каждый Поля разделяются двоеточиями. В первом примере на слайде, мы потянув за первый (User название) и пятой (полное имя пользователя, или GECOS) поле с / ETC / Passwd. Поля будут двоеточиями в выходной: # Cut-f1, 5-D: / и т.д. / Passwd Root: корневую ОГРН: бен Демон: Демон ... Обратите внимание, что Cut также позволяет выбрать набор символов ( "-C3-7"), но я не нахожу себя, воспользовавшись этой функцией, которая часто. 22 linux хостинг 23 С другой стороны, есть очень много файлов и выхода команды в Unix, которые являются разделяются любым количеством пробелов. Вырезать не занимается такого рода входной очень хорошо, но этот вид разбора является именно то, что AWK была разработана делать. AWK, очевидно, полномасштабный язык сценариев в своем собственном праве, но мы просто ограничиться простым AWK идиомы, которые полезны в командной строке. В самом простом, Awk просто распадается каждая строка ввода на пробелы и делает различных областях доступны в пронумерованных переменных $ 1, $ 2, и так далее. Так что если вы хотите всех идентификаторы процессов (вторая колонка) от некоторых PS выходной, просто направить вывод PS в "AWK '(PRINT $ 2)' ". Обычно необходимым процитировать AWK кода для защиты от интерполяция оболочкой. 23 linux хостинг 24 Подробнее AWK весело Ищите дополнительные UID 0 счетов: AWK-F: '($ 3 = = 0) (PRINT $ 1)' / ETC / Passwd Счета Если пароль не установлен: входов-P # Доступны не на всех системах Unix AWK-F: '($ 2 = = "") (PRINT $ 1)' / ETC / тень "... | Grep ... | AWK ..." считаются глупыми: убить `PS-EF | Grep SSHd | AWK '(PRINT $ 2)'` убить `PS-EF | AWK '/ SSHd / (PRINT $ 2)'` Однако, вы также можете использовать условные операторы с AWK, чтобы выбрать определенные строки из производство и принимать меры только по этим направлениям. В первом примере мы печатью пользователь Имена (поле 1) из всех строк в файле паролей, где UID (поле 3) равна нулю. Это может поможет вам обнаружить, если нападавшие добавлены дополнительные счета суперпользователя в середине больших Passwd файла. Обратите внимание, что AWK вполне способна решать с разделителями, чем другие пробелы просто указать символ-разделитель, после-F (по аналогии с опцией-D с Cut). Обнаружение счета с нулевым записей паролем является еще одним хорошим процедуру аудита, а также на Некоторые операционных системах Unix входа программа может помочь с этим. Однако, логины недоступна на широкий спектр операционных систем Unix (Linux, как и BSDs), но может быть AWK использоваться для выполнения той же вещи. Просто излучать имена пользователей по всем счетам, которые NULL второе поле в / ETC / тень. Отметим, что "PS-EF | Grep | AWK '(PRINT $ 2)'" представляет собой очень часто идиома. Обычно увидеть использовать внутри обратные кавычки с убить команду прекратить или иной процесс по имени. Тем не менее, Grep в это выражение на самом деле тратой времени, поскольку AWK имеет встроенный шаблон. Поэтому, пожалуйста, не включайте Grep - это больное место моей ... 24 linux хостинг 25 Сортировка Вы можете отсортировать по алфавиту или численно, и по областям: Сортировка / ETC / Passwd Сортировать-Н-K3-T: / ETC / Passwd А как насчет убыванию (обратно) числовой сортировки: WC-L * | Сортировать-Nr Sorting by inode is a useful forensic technique: ls -li /usr/bin | sort -n Сортировка Earlier we saw that the ls command has options for sorting its output in various ways, but Unix also provides a sort command for sorting arbitrary inputs. By default sort will do an alphabetic sort, but "sort -n" provides numeric sorting instead. sort is actually a very powerful program with a wide array of different options. For example, the second example shows how you can specify a delimiter character (similar to cut again) and sort on a particular field (in fact, sort actually lets you sort on multiple different fields at the same time if you want to). The "-r" option allows you to "reverse" the default sort order to do descending sorts. The last example on the slide is an extremely useful forensic technique. "ls -li" produces the typical "ls -l" output, but puts the inode number of each file in the first column of output. Every time a file is replaced it gets a new inode, and since inodes are generally assigned in numerical order, sorting the directory by inode will allow you to see the order in which files in that directory have been installed. The reason this is useful is that if an attacker installs a rootkit, the files installed by that rootkit will all be sorted together in the command output and all have inodes in the same small range of values. So even if the attacker has reset the timestamps on the files, you'll still be able to quickly see the files that got replaced by the attacker. 25 linux хостинг 26 uniq uniq eliminates duplicate lines from sorted data: cut -f3 -d: /etc/passwd | sort | uniq cut -f3 -d: /etc/passwd | sort –u Use " uniq -c " to get a count of repetitions: ps -ef | awk '{ print $1 }' | \ sort | uniq -c | sort -nr cut -f3 -d: /etc/passwd | \ sort | uniq -c | grep -v ' 1 ' uniq The uniq utility removes duplicate lines from its input. The trick is that the input needs to be sorted first, since uniq will only remove duplicate lines that are right next to one another in the input. So "… | sort | uniq" is a very common idiom– so common in fact that most versions of sort have a -u option that does the same thing as "… | sort | uniq". So do we really need a separate uniq program? It turns out that uniq has a number of useful options. Perhaps the most useful is the '-c' flag that displays a count of the duplicate lines from its input. In the middle example on the slide we're using awk to pull all of the user names from the output of ps and piping this to "sort | uniq -c" to get a count of the number of processes for each user. "sort -nr" gives us a nice descending sort: 26 linux хостинг 27 $ ps -ef | awk '{ print $1 }' | sort | uniq -c | sort -nr 34 root 8 apache 7 hal 1 UID 1 rpc 1 ntp 1 mysql 1 dbus The "1 UID" line is a result of the initial header line from ps. If we wanted to get rid of that we could do something like "ps -ef | tail +2 | awk …", but the above is good enough for most purposes. In the last example on the slide, we're pulling the UID values out of the /etc/passwd file and sending them to "sort | uniq –c". The last grep command discards any UIDs where the count from "uniq –c" is 1. The resulting output, therefore, is any duplicate UIDs (UIDs that appear more than once) in the passwd file (similar to "logins -d" on Unix operating systems that support the logins command). Since you shouldn't ever have duplicate UIDs in your password file, the output of this shell pipeline should normally be null. But obviously it's very interesting to you if the output isn't null. 27 linux хостинг 28 Use " .[^.]* " to match dot files (not " .* ") " less +G " lets you view files starting from the end Focus in quickly on missing lines: diff log1 log2 | grep '^>' # xtra in log2 diff log1 log2 | grep '^<' # xtra in log1 Quick substitutions with sed : sed s/ksh/bash/ /etc/passwd >/etc/passwd.new Job control (eg, su and ssh )… " user@host " syntax useful for ssh / scp / rsync … Other Random Tricks .* Considered Harmful Often you'll want to execute a command over all of the "dot files" in a directory (like a user's home directory, for example). The problem is that you might be tempted to do something like "chown -R hal .*". Unfortunately the ".*" ends up matching the special ".." link in the directory and your command ends up getting applied to the parent каталоге. And since we were using the recursive option ("-R") to the chown command in this case, then not only that parent directory but also all sub-directories of that directory end up getting owned by user hal. Usually this means that the home directories of all users on the system are now owned by hal. Cleaning up from this kind of mistake can be extremely painful because you can't simply assume that all files under a particular user's home directory are owned by that user (although this is the first approximation that most sites end up trying). You really should train yourself to always use ".[^.]*" instead of ".*". "[^.]" is Unix speak meaning "match any single character except dot". [Actually, I had always used .[A-Za-z0-9]* for matching "dot files", but Jordan Wiens suggested the shorter, more correct expression that appears here. Thanks for the tip, Jordan! --Hal] 28 linux хостинг 29 Don't Start at the Top Very often I want to view the contents of a file, but start from the end of the file rather than the beginning (log files are a good example of this). One of the advantages to less over other similar programs like more and pg is that less allows you start viewing the file from the end. What's going on here is that less allows you to specify commands that you would normally use inside of the less program on the command line after "+". Since "G" is the command to jump to the end of the file, all you have to do is run "less +G ". This is so useful that I've actually turned it into an alias in my regular окружающая среда. What's the diff? The normal output of diff shows you the differing lines with a "<" or ">" at the beginning of each line to indicate which of the two files on the command-line the displayed line has been taken from: $ diff /etc/passwd /etc/passwd.OLD 39c39 < hal:x:500:500:Hal Pomeranz:/home/hal:/bin/bash --- > hal:x:500:500::/home/hal:/bin/bash Sometimes, however, it's useful to focus in on just the lines in one particular file. Использование grep to filter on the greater-than/less-than symbols is a nice quick hack for doing this. Я find this idiom particularly useful when comparing log file versions– like when an attacker compromises your local log files but you have a secure, off-line copy to compare them against. [I should point out another Jordan Wiens suggestion here. My standard idiom was to simply "diff … | grep '>'", but Jordan correctly points out that this will end up matching lines where the greater-than/less-than symbol appears within a line of output. Adding the carets ("^") to match "beginning of line" is more correct. --Hal] 29 linux хостинг 30 Substitutions with sed Like awk, sed is a powerful scripting language in its own right, but it's incredibly useful for performing quick text substitutions in the middle of a shell pipeline. In the example on the slide we're converting all ksh users in the passwd file to bash users. Note that by default sed will only replace the first occurrence of the given string on each line of input (similar to the caret operation on your command history). However, you can use "s/…/…/g" to replace all instances of the string on each line. Управление заданиями You may be aware that you can use -Z to suspend a program running in a particular terminal window. The bg command will force that process to then run in the background, while fg will resume the process as normal. What's interesting is that you can do something similar with the root shell you get from running the su program. However, instead of using -Z you use the suspend command: $ /bin/su Пароль: # suspend [1]+ Stopped /bin/su $ fg /bin/su # This is extremely useful when you're having to switch back and forth between unprivileged and superuser access all the time because it means you don't have to constantly be entering the superuser password. 30 linux хостинг 31 You can even do something similar with remote SSH sessions. In the case of SSH, the magic key sequence is "-Z" ("tilde -Z"): [hal@bambi]$ ssh deer hal@deer's password: Last login: Wed … [hal@deer]$ ^Z [suspend ssh] [1]+ Stopped ssh deer [hal@bambi]$ fg ssh deer [hal@deer]$ Obviously, these techniques are somewhat less useful if you have multiple windows at your disposal, but I find myself using them quite frequently when operating on remote systems or on the text console of a machine. Another SSH Hack As long as we're on the subject of SSH, there's one more useful bit of command-line syntax I wanted to point out. You're probably aware that you can do "ssh -l " to log into a remote machine with a different user identity. But there's no equivalent to the "-l" option if you're using scp or rsync to copy files to another системы. So how would you copy files to a remote machine as another user? It turns out that SSH very closely implements the command-line syntax of the old BSD rlogin/rsh/rcp commands. This means that you can actually use the old-school " @ " syntax in your ssh/scp/rsync command-lines: [pomeranz@bobo]$ scp hal.key hal@deer:keyfile hal@deer's password: hal.key 100% 3221 3.2KB/s 00:00 31 linux хостинг 32 Can You Stump the Master? Have you got a command-line conundrum that you've been unable to solve? Now's the time to get some free consulting advice from your humble presenter. Think you've got the command-line chops to beat the master? OK, hit me with your most confounding command-line puzzle. It's on right here and now, grasshopper хостинг linux