У меня есть псевдоним, который передает некоторые параметры инструменту, который я часто использую. Иногда я бегаю как сам, иногда под sudo. К сожалению, конечно, sudo не распознает псевдоним.
У кого-нибудь есть подсказка, как пропустить псевдоним?
В этом случае у меня есть несколько опций для Perl при отладке:
alias pd='perl -Ilib -I/home/myuser/lib -d'
Иногда мне приходится отлаживать свои инструменты как root, поэтому вместо запуска:
pd ./mytool --some params
Мне нужно запустить его под sudo. Я пробовал много способов:
sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"
Я надеялся на хороший, лаконичный способ убедиться, что мой текущий псевдоним pd был полностью использован (на случай, если мне понадобится настроить его позже), хотя некоторые из моих попыток были совсем не краткими. Мое последнее средство - поместить его в сценарий оболочки и поместить его где-нибудь, что sudo сможет найти. Но псевдонимы иногда оооочень удобны, так что это последнее средство.
А очень элегантное решение можно найти в Archlinux-Wiki:
alias sudo='sudo '
# whitespace ---^
работает, чтобы передать все псевдонимы sudo
.
Источник: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases
Я не совсем понимаю, что вы пытаетесь сделать. Я вижу два пути:
alias pd='sudo perl -Ilib -I/home/myuser/lib -d'
Затем выполнение pd ./mytool
выполнит вашу команду отладки от имени пользователя root, но при этом сохранит преимущества sudo (контрольный журнал, работа не из корневой оболочки).
Пример:
insyte$ alias sid='sudo id' insyte$ sid uid=0(root) gid=0(root) groups=0(root)
Добавьте псевдонимы к root .bashrc
и использовать sudo -i
всякий раз, когда вы выполняете sudo для получения root-прав.
root# echo 'alias fb="echo foo bar"' >> /root/.bashrc root# exit exit insyte$ sudo -i root# fb foo bar
Просто имейте два псевдонима и используйте переменную
Я не вижу причин использовать awk
или cut
если только основной псевдоним не был определен один раз, чтобы упростить его изменение. Если это так, то это работает:
# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"
Вот упрощенная функция для создания пар псевдонимов, подобных приведенной выше:
mkap () {
alias $1=$2
alias s$1="sudo $2"
}
Использовать:
mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'
Теперь у вас есть pd
и spd
плюс ct
и sct
.
$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'
Хотел бы я отметить два ответа как «правильные». Сочетание правильного пути от Инсайтпроницательный пост с awk (или вырезанным) решением из Билл Вайс, Я придумал это:
alias spd="sudo $(alias pd | cut -d\' -f2)"
Теперь я просто вставлю это в функцию оболочки в моем .bashrc или что-то в этом роде, а затем создам "s"-версии всех моих псевдонимов, которые я хочу запустить как root.
Обновить: небольшая модификация Деннис Уильямсонупрощенная функция, которая немного упрощает использование:
salias()
{
local a c
a=$(echo "$1" | cut -f1 -d=)
c=$(echo "$1" | cut -f2- -d=)
alias $a="$c"
alias s$a="sudo $c"
}
Это означает, что мне просто нужно поставить «s» перед всей командой. Вместо того:
alias pd='perl -Ilib -I/home/myuser/lib -d'
Я просто добавляю букву s спереди.
salias pd='perl -Ilib -I/home/myuser/lib -d'
И я закончил. Конечно, компьютер выполняет немного больше работы, но компьютер для этого нужен. :-)
Спасибо!
из http://www.shellperson.net/using-sudo-with-an-alias/
alias sudo='sudo '
Не было бы проще просто взломать сценарий, который включает ваши параметры, а затем поместить его где-нибудь в одну из папок, которая является путем для обычной учетной записи и root? Это действительно не займет много сценария.
#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*
Это грубо, но здесь работает:
houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c
Добавьте префикс "sudo" к выбранному псевдонимы И команды изнутри вашего ~/.bashrc
вот так:
#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'
#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
do alias "s$cmd"="sudo $cmd";
done;
Как писали несколько раз, сделайте в '.bashrc':
псевдоним sudo = 'sudo'
Причина объясняется в man bash и help alias:
псевдоним: псевдоним [-p] [имя [= значение] ...] Определить или отобразить псевдонимы.
Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.
Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**
Вам нужно что-то вроде этого:
(alias; echo "exec < /dev/tty") | sudo bash -i
Не знаю, лучше ли это делать на производственной коробке, но я использую локально
alias sudo="sudo -E"
-E (сохранить окружающую среду) будет переопределять параметр env_reset в sudoers (5)). Он доступен только в том случае, если либо соответствующая команда имеет тег SETENV, либо параметр setenv установлен в sudoers (5).
Можете ли вы добавить псевдоним в .bashrc root или просто выполнить .bashrc через sudo перед вашей командой?
sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)