FastNetMon

Показаны сообщения с ярлыком Bash. Показать все сообщения
Показаны сообщения с ярлыком Bash. Показать все сообщения

понедельник, 15 ноября 2010 г.

Пошаговое исполнение /bin/sh скриптов

Часто для отладки нужно понять, что же именно сейчас делает bash в данный момент, это весьма легко, открываем нужный нам скрипт:
vi /sbin/grub-install

И в самом верху заменяем:
#!/bin/sh

на

#!/bin/sh -x

В итоге при запуске скрипта мы получим крайне приятный трейс:
+ for file in '${grubdir}/stage1' '${grubdir}/stage2' '${grubdir}/*stage1_5'
+ echo /boot/grub/stage1
/boot/grub/stage1
+ count=5
++ echo /boot/grub/stage1
++ sed 's|^/boot/grub|/grub|'
+ tmp=/grub/stage1
+ test 5 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 5 - 1
+ count=4
+ test 4 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 4 - 1
+ count=3
+ test 3 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 3 - 1
+ count=2
+ test 2 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 2 - 1
+ count=1
+ test 1 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 1 - 1
+ count=0
+ test 0 -gt 0
+ test 0 -eq 0
+ echo 'The file /boot/grub/stage1 not read correctly.'
The file /boot/grub/stage1 not read correctly.
+ exit 1


А если ключик -x заменить на -vx, то bash начнет выводить текст блоков кода до вывода трейса, что крайне удобно.

понедельник, 1 ноября 2010 г.

Как выкинуть определенного пользователя из ssh?

Иногда нужно выбросить определенного пользователя из ssh, допустим, на время выполнения тех работ. Есть ряд нестандартных решений (ps aux + kill -9), но оказывается есть вполне стандартное решение задачи.

Итак, имеем двух пользователей root одновременно работающих на сервере (это разные люди):
w
18:08:13 up 17:03, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 xx.xx.xx.xx 18:07 0.00s 0.00s 0.00s w
root pts/1 yy.yy.yy.yy 18:08 9.00s 0.00s 0.00s -bash

Нам нужно выкинуть пользователя с IP yy.yy.yy.yy, смотрим, какой tty (терминал) ему соответствует, это pts/1 и отключаем его:
skill -KILL -t pts/1

Вуаля, мы остались в гордом одиночестве:
w
18:08:36 up 17:03, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 xx.xx.xx.xx 18:07 0.00s 0.00s 0.00s w

А выброшенный пользователь увидел примерно следующее:
Connection to xx.yy.zz.kk closed.

Далее возникает вопрос - как избежать того, чтобы пользователь вошел снова. Можно сделать это вот так, просто сгенерировав новый пароль для пользователя и установив его:
apt-get install -y pwgen # ставим генератор паролей
pwgen 16 1
passwd

После смены еще раз убеждаем, не переподключился ли второй пользователь снова командой:
w

После этого можно смело продолжать работать с машиной не беспокоясь, что кто-либо помешает.

Источник: http://www.cyberciti.biz/tips/howto-linux-kill-and-logout-users.html

четверг, 19 августа 2010 г.

Кривая кодировка в Linux консоли, как бороться?

Многие пользователи уж очень любят ставить русскую локаль в SSH, при поддержке же это выливается в постоянные проблемы с кракозяблами :) Так мало того, что машину нужно починить, так еще и кракозяблы победить нужно!

Итак, есть универсальное решение вот такой проблемы:

apt-get install locales-all
?????? ??????? ???????... ??????
?????????? ?????? ????????????
?????? ?????????? ? ?????????... ??????
??? ??????????? ????? ????? ?????? locales-all.
????????? ?????? ??????????????? ????????????? ? ?????? ?? ?????????:
libdns45 libisccc40 liblwres40 libbind9-40 libisccfg40 libisc45
??? ?? ???????? ??????????? 'apt-get autoremove'.
????????? 0, ??????????? 0 ????? ???????, ??? ???????? ???????? 0 ???????, ? 0 ??????? ?? ?????????.
?? ??????????? ?? ????? ??? ??????? 1 ???????.
????? ?????? ????????, ??ߣ? ???????? ????????? ???????????? ??????ԣ? ?? 0B.
????????????? ????? acct (6.4~pre1-6) ...
chown: ???????? ??????: `root:adm'
dpkg: ?? ??????? ?????????? ???????? acct (--configure):
?????????? post-installation script ????????? ??? ?????? 1
??? ????????? ????????? ??????? ????????? ??????:
acct
E: Sub-process /usr/bin/dpkg returned an error code (1)


Мало понятного, не правда ли?

При запросе текущей локали получаем имя виновницы торжества:

locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R


А теперь узнаем, какие переменные среды за нее отвечают:

env | grep KOI
LC_ALL=ru_RU.KOI8-R
LANG=ru_RU.KOI8-R


И теперь, вуаля:

LANG=C LC_ALL=C apt-get install locales-all
Reading package lists... Done
Building dependency tree
Reading state information... Done
locales-all is already the newest version.
The following packages were automatically installed and are no longer required:
libdns45 libisccc40 liblwres40 libbind9-40 libisccfg40 libisc45
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 0B of additional disk space will be used.
Setting up acct (6.4~pre1-6) ...
chown: invalid group: `root:adm'
dpkg: error processing acct (--configure):
subprocess post-installation script returned error exit status 1
Errors were encountered while processing:
acct
E: Sub-process /usr/bin/dpkg returned an error code (1)


Кстати, еще бывают всевозможные новомодные шелл-оболочки (придуманные, очевидно, чтобы замучать бедных ничего не делающих администраторов), которые лучше отключить вызовом привычного баша командой:
bash

среда, 11 августа 2010 г.

-bash: /bin/rm: Argument list too long

Эта ошибка выдается при попытке удалить все файлы в папке с очень большим числом файлов:
rm * -f


Но есть обходной путь решения этой проблемы:
find | xargs --no-run-if-empty -n 500 rm -f


При таком подходе файлы будут поступать на вход rm по 500 штук и все быстро удалится.

пятница, 21 мая 2010 г.

Поиск всех дисковых устройств на сервере

blkid
/dev/sda1: UUID="d9f5b65e-bb67-8777-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sda2: UUID="5edaf8f7-cc8c-666c-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sda3: UUID="5f852b9a-70b4-b4c1-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdb1: UUID="d9f5b65e-bb67-8777-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdb2: UUID="5edaf8f7-cc8c-666c-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdb3: UUID="5f852b9a-70b4-b4c1-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdc1: UUID="d801006d-8564-4409-b7f3-205321ef53f0" TYPE="ext3"
/dev/sdd1: UUID="fc6cf046-8036-48ee-af0e-d877613b9c20" TYPE="ext3"
/dev/md0: UUID="e0da3930-a7d8-4c66-bbc1-77d881a7d48e" TYPE="swap"
/dev/md1: UUID="91d1c518-b31c-4930-95ae-c41dc77c6d46" TYPE="ext3"
/dev/md2: UUID="1ff0f06d-a0de-4a2c-bffb-4bf2ffef4c1f" TYPE="ext3"

понедельник, 12 апреля 2010 г.

Как посчитать суммарное дисковое пространство, выделенное всем VPS?

Вот таким несложным скриптом:
cat /etc/vz/conf/*.conf | grep DISKSPACE | tr '=' ' ' | tr ':' ' ' | tr '"' ' ' | awk '{print $2}' | perl -e '$a+=$_ for<>; print $a / 1024 / 1024'


Обращаю внимание, считаются также и выключенные VPS.