среда, 30 января 2008 г.

О linux tips'n'trics

Очень часто работая в linux необходимо сделать простые операции, тем не менее требующие нетривиальных действий. Что делать, идешь в гугл, смотришь рецепт. Но через некоторое время рецепт забывается, и приходится терять время на поиск заново. В таких случаях я стараюсь выписывать эти trics'ы в определенное место, чтобы потом вспомнить что и как делать. Так вот и накопился наборчик полезных приемов, чем я и собираюсь поделится с общественностью.


Как снять флаг executable только для файлов в каталоге


Часто при совместном использовании windows возникает ситуация, когда на скопированных из fat-разделов файлах стоят executable флаги. Chmod -rx здесь не поможет, так как уберет разрешение на вход в каталоги. Но поможет вот эта команда:
find . -type f -exec chmod -x {} \;
Эта команда снимет флажки x со всех файлов в текущем каталоге, но оставит в неприкосновенности каталоги, линки, пайпы и т.п. Вариация данной команды также может быть использована для следующей задачи.


Поиск файлов по содержимому


Используя тот же принцип, мы можем искать файлы не только по имени и типу, но и по содержимому. Пример:
find ~ -exec egrep -i "password" /dev/null {} \;
Данная команда найдет все файлы в домашнем каталоге, содержащие слово "password". Естественно, вместо этого слова можно вписать любое регулярное выражение.


Echo и sudo


Довольно долго мучался по поводу следующей проблемы. Часто требуется выполнить команду такого рода:
sudo echo "hello world" >> /path/to/file
Т.е. от имени суперпользователя записать что-либо в файл иначе недоступный для записи. На это shell ругнется, сказав о нехватке прав. Это связанно с процессом выполнения данной команды: файл /path/to/file открывается от имени обычного пользователя, тогда как первая часть команды выполняется от рута. При перенаправлении stdout в открытый файл и возникает ошибка.

Ситуацию можно исправить следующим образом:
sudo sh -c 'echo "Hello world" >> /path/to/file'
Однако, есть и более элегантный способ. Для этого понадобится команда tee, читающая stdin и пишушяя в stdout или файл:
echo "hello world" | sudo tee -a /path/to/file
Если необходимо перенаправление вида ">" вместо ">>", флажок "-a" не используем:
echo "hello world" | sudo tee /path/to/file
Лично мне эта конструкция экономит много полезных секунд :).


Создание и монтирование образа iso


Очень часто возникает необходимость смонтировать образ. Это делается довольно просто:
mount -o loop -t iso9660 filename.iso /mnt/iso
Команда монтирует образ filename.iso в директорию /mnt/iso. Однако, здесь есть оговорка: чтобы выполнить эту команду нужно быть рутом, а также должно быть настроено loopback устройство.

Создать образ с имеющегося диска также несложно:
dd if=/dev/cdrom of=file.iso
При необходимости создать образ из исходных файлов, можно воспользоваться утилитой mkisofs (пакет в gentoo - app-cdr/cdrtools):
mkisofs ~/file.iso /tmp/directory
где file.iso - создаваемый образ, /tmp/directory - каталог с исходными файлами.


Копирование, локальное и не только

Кроме использования стандартной команды "cp" существует оригинальный способ копирования через пайпы (pipes):
cd /
tar -cf - | tar -C -xf -
Команда скопирует каталог в каталог . Этот способ очень полезен при копировании больших объемов данных. При необходимости можно добавить и архивацию ключиком "-z" или "-j":
tar -czf -  | tar -C  -xzf -
Этот рецепт можно немного дополнить. При необходимости передачи файлов по сети из локальной машины на удаленную можно использовать следующую конструкцию:
cd /
tar czf - | ssh tar xzf - -C
В результате получился некий аналог scp.


X Forwarding


Полезная и простая фича. Если нужно запустить на удаленной машине что-то, требующее X'ы, добавляем к стандартной команде ssh пару ключиков:
ssh -X -Y 
и спокойно запускаем графические приложения на удаленной машине remote_box.


Генерация паролей


И на десерт еще одна простая утилита. Если вы устали придумывать пароли, воспользуйтесь pwgen (app-admin/pwgen в портах gentoo).

Результатом будет нечто подобное:
Er5quaib huDoo3yo AhKie0oZ AeV2Retu Loh9Ahku AhRoh3ae Ooph6eeS pum2Aoch
Bohzei6u aeDe6ahk JieH4eiG aej8Iegh Ais5docu chahR4ku eigo2Gai xutaa3Vo
...
Осталась самая малость - запомнить выбранный пароль :).

Удачи!