Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

bash$ w | grep startx

bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx

logname

Выводит имя текущего пользователя (из файла /var/run/utmp). Это довольно близкий эквивалент команды whoami.

bash$ logname

bozo

bash$ whoami

bozo

Однако...

bash$ su

Password: ......

bash# whoami

root

bash# logname

bozo

su

Команда

предназначена для запуска программы или сценария от имени другого пользователя. su rjones– - запускает командную оболочку от имени пользователя rjones. Запуск команды su без параметров означает запуск командной оболочки от имени привилегированного пользователя root. См. Пример A-17.

sudo

Исполняет заданную команду от имени пользователя root (или другого пользователя).

#!/bin/bash

# Доступ к "секретным" файлам.

sudo cp /root/secretfile /home/bozo/secret

Имена пользователей, которым разрешено использовать команду sudo, хранятся в файле /etc/sudoers.

passwd

Устанавливает или изменяет пароль пользователя.

Команда passwd может использоваться в сценариях, но это плохая практика.

#!/bin/bash

# set-new-password.sh: Плохая идея.

# Этот сценарий должен запускаться пользователем root,

#+ а еще лучше -- не запускать его вообще.

ROOT_UID=0 # $UID root = 0.

E_WRONG_USER=65 # Не root?

if [ "$UID" -ne "$ROOT_UID" ]

then

echo; echo "Только root может запускать этот сценарий."; echo

exit $E_WRONG_USER

else

echo; echo "Вам не следовало бы запускать этот сценарий."

fi

username=bozo

NEWPASSWORD=security_violation

echo "$NEWPASSWORD" | passwd --stdin "$username"

# Ключ '--stdin' указывает 'passwd'

#+ получить новый пароль со stdin (или из конвейера).

echo; echo "Пароль пользователя $username изменен!"

# Использование команды 'passwd' в сценариях -- опасно.

exit 0

ac

Выводит время работы пользователей, основываясь на записях в файле /var/log/wtmp. Это одна из утилит пакета GNU acct.

bash$ ac

total 68.08

last

Выводит информацию о последних входах/выходах пользователей в ситему, основываясь на записях в файле /var/log/wtmp. Эта команда может отображать информацию об удаленных (в смысле -- с удаленного терминала) соединениях.

newgrp

Позволяет сменить активную группу пользователя. Пользователь остается в системе и текущий каталог не изменяется, но права

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

Терминалы

tty

Выводит имя терминала текущего пользователя. Обратите внимание: каждое отдельное окно xterm считается отдельным терминалом.

bash$ tty

/dev/pts/1

stty

Выводит и/или изменяет настройки терминала. Эта сложная команда используется в сценариях для управления поведением терминала.

Пример 13-1. Установка символа "забоя"

#!/bin/bash

# erase.sh: Использование команды "stty" для смены клавиши "забоя" при чтении ввода.

echo -n "Как Вас зовут? "

read name # Попробуйте стереть последние символы при вводе.

# Все работает.

echo "Вас зовут $name."

stty erase '#' # Теперь, чтобы стереть символ нужно использовать клавишу "#".

echo -n "Как Вас зовут? "

read name # Попробуйте стереть последние символы при вводе с помощью "#".

echo "Вас зовут $name."

exit 0

Пример 13-2. невидимый пароль: Отключение эхо-вывода на терминал

#!/bin/bash

echo

echo -n "Введите пароль "

read passwd

echo "Вы ввели пароль: $passwd"

echo -n "Если кто-нибудь в это время заглядывал Вам через плечо, "

echo "то теперь он знает Ваш пароль."

echo && echo # Две пустых строки через "and list".

stty -echo # Отключить эхо-вывод.

echo -n "Введите пароль еще раз "

read passwd

echo

echo "Вы ввели пароль: $passwd"

echo

stty echo # Восстановить эхо-вывод.

exit 0

Перехват нажатия на клавиши с помощью stty.

Пример 13-3.

#!/bin/bash

# keypress.sh: Определение нажатых клавиш.

echo

old_tty_settings=$(stty -g) # Сохранить прежние настройки.

stty -icanon

Keypress=$(head -c1) # или $(dd bs=1 count=1 2> /dev/null)

# для других, не GNU, систем

echo

echo "Была нажата клавиша \""$Keypress"\"."

echo

stty "$old_tty_settings" # Восстановить прежние настройки.

# Спасибо, Stephane Chazelas.

exit 0

См. также Пример 9-3.

Поделиться с друзьями: