Вопрос или проблема
Я на AIX 7.1.
У меня есть куча алиасов, определенных в моем личном .profile.
alias df="df -k"
alias cl=clear
alias h=history
alias ll="ls -al"
alias lt="ls -latr"
alias ls="ls -Fa"
alias psj='ps -ef | grep java'
Если я ввожу команду ‘sudo su’ или ‘sudo su other_user’, я не могу использовать эти алиасы. У меня было впечатление, что использование ‘sudo su’ без ‘-‘ (sudo su -) сделает меня root, используя мой личный .profile?
jg10371@asdepdm1: /home/jg10371
$ ll
total 88
drwx------ 3 jg10371 unxusers 4096 May 29 09:21 ./
drwxr-xr-x 154 bin bin 12288 May 29 09:35 ../
-rw------- 1 root system 200 Jul 04 2010 .bash_history
-rw-r--r-- 1 jg10371 unxusers 1943 May 29 09:35 .profile
-rw------- 1 jg10371 unxusers 6944 May 29 09:36 .sh_history
drwx------ 2 jg10371 unxusers 256 May 28 11:06 .ssh/
-rw------- 1 jg10371 unxusers 44 May 28 12:21 .vas_disauthcc_9168
-rwx------ 1 jg10371 unxusers 28 May 28 12:21 .vas_logon_server*
-rwx------ 1 jg10371 unxusers 18 Mar 28 18:06 .vi_history*
jg10371@asdepdm1: /home/jg10371
$ sudo su
Password:
jg10371@asdepdm1: /home/jg10371
$ ll
ksh: ll: not found.
jg10371@asdepdm1: /home/jg10371
Да, на самом деле, вход в другую учетную запись (root в этом случае) создаст новую сессию, и настройки будут из файла .bashrc
или .kshrc
root. Вы можете увидеть это в следующем:
$ alias
$ ... вывод содержит более 100 алиасов
$ sudo su
[sudo] пароль для durrantm:
root@Castle2012:/tmp/user/1000/x# alias # <- Теперь только 7 алиасов!
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l="ls -CF"
alias la="ls -A"
alias ll="ls -alF"
alias ls="ls --color=auto"
root@Castle2012:/tmp/user/1000/x# cat ~/.bashrc
# ~/.bashrc: выполняется bash(1) для не-логин оболочек.
# см. /usr/share/doc/bash/examples/startup-files (в пакете bash-doc)
# для примеров
...
# включить поддержку цвета для ls и также добавить удобные алиасы
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls="ls --color=auto"
#alias dir="dir --color=auto"
#alias vdir="vdir --color=auto"
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# еще несколько алиасов для ls
alias ll="ls -alF"
alias la="ls -A"
alias l="ls -CF"
...
root@Castle2012:/tmp/user/1000/x#
Тем не менее, вы можете экспортировать вашу среду – только для этой сессии – с помощью sudo -E.
Вы можете сделать алиас доступным для ВСЕХ оболочек навсегда, разместив определение алиаса в
/etc/bash.bashrc # (Вам нужно отредактировать его с помощью sudo!)
# /etc/profile для ksh
и вы также можете добавить условную логику, чтобы делать это только если имя пользователя соответствует root или тому, что вам нужно.
Что ж, как вы уже заметили, это не так. В записи manpage говорится “sudo – выполнить команду от имени другого пользователя”, что означает, что алиасы и переменные bash изменятся соответствующим образом. А когда вы делаете “sudo ll”, система замечает, что пользователь root ничего не знает об ll.
Если вы хотите, чтобы ваши алиасы были доступны как root, вы можете либо скопировать определения в файл профиля root, либо создать отдельный файл алиасов и включить его с помощью команды source. (Возможно включить и сам файл профиля пользователя, но у вас могут быть строки в нем, которые не должны приниматься root.)
Это легко исправить частично для вашего случая, пока вы запускаете sudo some_command
и не получаете оболочку через sudo su
или подобное. Это основано на порядке, в котором оболочка оценивает вещи, и довольно удобно.
Проверьте https://askubuntu.com/a/22043/329633 или https://serverfault.com/questions/61321/how-to-pass-alias-through-sudo и добавьте этот sudo алиас в ваш ~/.kshrc
(Я предполагаю, что вы используете оболочку AIX по умолчанию, так как у вас нет ~/.bashrc
и ~/.bash_history
в вашем отрывке 5 лет.)
Если вы хотите добавить алиас для конкретного пользователя и используете оболочку по умолчанию, которая является ksh, а не bash, то поместите алиасы в ~/.kshrc
файл этого пользователя, а не в ~/.bashrc.
Вы также можете настроить sudo так, чтобы он сохранял среду вашего пользователя, проверьте, например, сохранить алиасы, когда я использую sudo bash для деталей.
Или если команды и алиасы должны быть доступны всем пользователям, вы также можете добавить это в /etc/environment.
Если вы хотите, чтобы иметь возможность выполнять алиасы другого пользователя как root без необходимости делать какую-либо дополнительную работу (например, копирование определений алиаса в файл профиля root, преобразование алиасов пользователя в скрипты оболочки), тогда вы можете извлечь команду алиаса и передать ее оболочке.
Пример:
sudo su - otheruser -s /bin/bash -c "alias ll | sed -E \"s/.+='(.+)'/\1/\" | bash"
Или вы можете использовать мою универсальную функцию “run-as”:
runas() {
if [ $# -eq 2 ]; then
# Проверка, существует ли пользователь
id -u $1 > /dev/null 2>&1
if [ $? -gt 0 ]; then
echo "$FUNCNAME: нет такого пользователя"
return 1
fi
# Проверка, существует ли алиас
sudo su - $1 -s /bin/bash -c "alias $2" > /dev/null 2>&1
if [ $? -eq 0 ]; then
# Алиас определен; выполните $2 как алиас
sudo su - $1 -s /bin/bash -c "alias $2 | sed -E \"s/.+='(.+)'/\1/; s/'\\\'//g\" | bash"
else
# Алиас не определен; выполните $2 как команду
sudo su - $1 -s /bin/bash -c "$2"
fi
else
echo "Выполнить команду или алиас от имени другого пользователя"
echo "Использование: $FUNCNAME USER ALIAS"
return 2
fi
}
Вы можете получить “root” оболочку со всеми вашими алиасами с помощью следующего (при условии, что bash – ваша оболочка):
sudo -E bash
Ответ или решение
Когда вы работаете с AIX 7.1 и используете команду sudo su
для получения привилегий суперпользователя (root), вы можете столкнуться с проблемой, заключающейся в том, что ваши пользовательские алиасы, определённые в файле ~/.profile
, становятся недоступными. Это происходит потому, что команда sudo su
запускает новую сессию оболочки для пользователя root, и в этой сессии используются настройки и конфигурации, определённые для root, а не для вашего пользователя.
Причины недоступности алиасов
-
Сессия оболочки: При выполнении команды
sudo su
создаётся новый сеанс с учётом конфигурации пользователя root. Это означает, что алиасы, заданные в вашем профиле, окажутся недоступны, так как они хранятся в~/.profile
, который не загружается для root. Вместо этого используется файл конфигурации, связанный с оболочкой root (например,~/.kshrc
для ksh). -
Команда без
-
: Использованиеsudo su
без знака-
приводит к тому, что система не загружает окружение для нового пользователя, что опять же означает отсутствие личных алиасов и конфигураций.
Решения для доступа к алиасам при использовании sudo su
-
Дублирование алиасов: Один из простых способов решить данную проблему — это скопировать ваши алиасы в файл конфигурации пользователя root. Это можно сделать, отредактировав файл
~/.kshrc
для root и добавив туда все необходимые алиасы. Однако это потребует постоянного обновления обоих файлов при изменении алиасов. -
Создание общего файла алиасов: Можно создать отдельный файл со всеми вашими алиасами, а затем включить его с помощью команды
source
в~/.kshrc
пользователя root. Это позволит легко управлять алиасами и подключать их при необходимости. -
Использование
sudo -E
: Если вы хотите сохранить ваше окружение, используяsudo
, добавьте флаг-E
. Командаsudo -E <команда>
будет передавать ваши переменные окружения, что позволит вам использовать некоторые настройки, но алиасы всё равно не будут доступны. -
Алиасы для всех пользователей: Если требуется, чтобы алиасы были доступны всем пользователям, их можно добавить в глобальные файлы, такие как
/etc/profile
для ksh или/etc/bash.bashrc
для bash. Это обеспечит доступность алиасов для всех пользователей системы, но может потребовать разрешений администратора. -
Использование оболочки: Для работы с алиасами пользователя во временно поднятом сессии root можно использовать следующий подход:
sudo su - <ваш_пользователь> -s /bin/ksh -c "<команда>"
Это обеспечит загрузку конфигураций для вашего пользователя.
-
Создание функции: Можно создать функцию, которая будет вызывать алиасы пользователя в контексте root. Этот метод требует больше усилий на разработку, но может быть удобным для частого использования.
Пример
Для создания функции, которая выполняет команду от имени другого пользователя с использованием его алиасов, можно использовать следующий код:
runas() {
if [ $# -eq 2 ]; then
sudo su - $1 -s /bin/ksh -c "alias $2 | sed -E 's/.+='(.+)'/\1/' | ksh"
else
echo "Использование: $FUNCNAME ПОЛЬЗОВАТЕЛЬ АЛИАС"
fi
}
Теперь вы сможете удобно использовать алиасы, прописанные для другого пользователя, без необходимости дублирования их в файлах конфигурации.
Заключение
Таким образом, работа с алиасами при переходе на уровень суперпользователя требует дополнительного подхода к управлению конфигурациями. Выбирайте подходящий для ваших задач метод — дублируйте алиасы, используйте общие конфигурации или создавайте функции для временного доступа.