සුඩෝ භාවිතා කරන විට අන්වර්ථ නාම නොමැත


173

මම අද අන්වර්ථ නාමයන් සමඟ සෙල්ලම් කරමින් සිටියෙමි sudo.

danny@kaon:~$ alias
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'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

භාවිතා කරන අතරතුර ඔබට අන්වර්ථ නාම භාවිතා කිරීමට නොහැකි වීමට හේතුවක් sudoතිබේද?


ඔබ එම අන්වර්ථය .bashrc හි / root /
ලුසියානෝ ෆැචිනෙල්ලි

2
@LucianoFacchinelli: /root/.bashrcsudo හරහා විධානයක් ක්‍රියාත්මක කිරීමේදී කියවන්නේ නැත.
ෆ්ලිම්


LiFlimm: මොකද sudo -i?
Evi1M4chine

Answers:


269

ඔබගේ පහත දැක්වෙන පේළිය එක් කරන්න ~/.bashrc:

alias sudo='sudo '

සිට bash අත්පොත :

සරල විධානයක පළමු වචනය ලෙස වචනයක් භාවිතා කරන විට අන්වර්ථ නාමයක් ආදේශ කිරීමට ඉඩ දෙයි. කවචය අන්වර්ථ හා යුනාලියා බිල්ඩින් විධාන සමඟ සැකසිය හැකි හා සැකසිය හැකි අන්වර්ථ නාම ලැයිස්තුවක් පවත්වාගෙන යයි.

එක් එක් සරල විධානයක පළමු වචනය, නම් නොකෙරේ නම්, එයට අන්වර්ථයක් තිබේදැයි පරීක්ෂා කරනු ලැබේ . එසේ නම්, එම වචනය අන්වර්ථයේ පෙළ මගින් ප්‍රතිස්ථාපනය වේ. '/', '$', '`', '=' සහ ඉහත ලැයිස්තුගත කර ඇති ඕනෑම ෂෙල් මෙටාචරැක්ටර්ස් හෝ උපුටා දැක්වීමේ අක්ෂර අන්වර්ථ නාමයකින් නොපෙන්වයි. ප්‍රතිස්ථාපන පා text යේ ෂෙල් මෙටාචරැක්ටර් ඇතුළු ඕනෑම වලංගු ෂෙල් ආදානයක් අඩංගු විය හැකිය. ආදේශන පා of යේ පළමු වචනය අන්වර්ථයන් සඳහා පරීක්ෂා කරනු ලැබේ, නමුත් අන්වර්ථයක් පුළුල් වන විට සමාන වන වචනයක් දෙවන වරටත් පුළුල් නොවේ. මෙයින් අදහස් කරන්නේ යමෙකු ls "ls -F" ලෙස අන්වර්ථ කළ හැකි බවත්, ආදේශන පෙළ පුනරාවර්තනය කිරීමට බාෂ් උත්සාහ නොකරන බවත්ය. අන්වර්ථ අගයෙහි අවසාන අක්‍ෂරය අවකාශයක් හෝ ටැබ් අක්ෂරයක් නම්, අන්වර්ථය අනුගමනය කරන ඊළඟ විධාන වචනය ද අන්වර්ථ ප්‍රසාරණය සඳහා පරීක්ෂා කරනු ලැබේ .

(අවධාරණය මගේ).
බාෂ් අන්වර්ථයක් සඳහා විධානයක පළමු වචනය පමණක් පරික්ෂා කරයි, ඉන් පසුව ඇති ඕනෑම වචන පරික්ෂා නොකරයි. ඒ කියන්නේ අන්වර්ථයක් සඳහා bash මගින් පරීක්ෂා කරනු ලබන sudo llපළමු වචනය ( sudo) වැනි llනොසලකා හරිනු ලැබේ. sudoඅන්වර්ථ අගයේ අවසානයට අවකාශයක් එක් කිරීමෙන් අන්වර්ථය (එනම් ) පසු ඊළඟ වචනය පරීක්ෂා කරන ලෙස අපට බාෂ්ට පැවසිය හැකිය .


21
ලස්සන විසඳුමක්.
ulidtko

1
Askubuntu.com හි වර්තමාන මෝස්තරය සමඟ අවධාරණය කළ උපුටා දැක්වීම එතරම් හොඳින් නොපෙන්වයි. කුතුහලය දනවන අය සඳහා, මෙහි ප්‍රධාන රේඛාව මෙයයි: " අන්වර්ථ අගයෙහි අවසාන අක්‍ෂරය අවකාශයක් හෝ ටැබ් අක්ෂරයක් නම්, අන්වර්ථය අනුගමනය කරන ඊළඟ විධාන වචනය ද අන්වර්ථ ප්‍රසාරණය සඳහා පරීක්ෂා කරනු ලැබේ. "
40XUserNotFound

2
ප්‍රලේඛනය කියවීමෙන් බොහෝ ප්‍රයෝජන ලැබෙනු ඇත :-)
biocyberman

5
මම සුඩෝ කොඩියක් භාවිතා කළහොත් මෙය කැඩී යනු ඇත්ද sudo -H ll?
මාර්ක් ඊ. හේස්

1
@mehaase ඔව්, මම උත්සාහ කළ අතර එය කැඩී යයි.
user31389

5

අන්වර්ථ නාම පරිශීලක විශේෂිත වේ - ඔබ ඒවා අර්ථ දැක්විය යුතුය /root/.bashrc


3
ඒවා දැනටමත් /root/.bashrc යටතේ පවතින බැවින් එය ගැටළුවක් නොවේ
kemra102

1
මෙම පිළිතුර නිවැරදි වන්නේ ඔබ කවචය මූලයක් ලෙස ධාවනය කරන විට sudo -sහෝ sudo -i( හෝ මූල කවචයක් ලබා ගැනීම සඳහා තනිවම ධාවනය වන්නේ නම් හෝ ආකෘති සමඟ නොවේ ) හෝ හෝ ඔබ සිටින තත්වයට පමණි. අපි මූල පිවිසුම් සක්‍රීය කර ඇති අතර ඒ ආකාරයෙන් මූල කවචයක් ඇත. මූල නොවන පරිශීලකයෙකු තමන්ගේම කවචයෙන් ධාවනය වන විට, අන්වර්ථ ප්‍රසාරණය සිදු කරනු ලබන්නේ ඔවුන්ගේම මූල නොවන කවචයෙනි. අන්වර්ථයන් පුළුල් නොකරයි, එබැවින් ප්‍රශ්නයේ විස්තර කර ඇති තත්වයට අදාළ වන පරිදි මෙම පිළිතුර වැරදිය. sudo -s command...sudo -i command...sudo bashsudo susudo command...sudo
එලියා කගන්

5

මම ඒ සඳහා Bash ශ්‍රිතයක් ලිව්වා sudo.

එය ලබා දී ඇති විධානය සඳහා අන්වර්ථයක් තිබේද යන්න පරික්ෂා කරන sudoඅතර එම අවස්ථාවේ දී වචනානුසාරයෙන් නොව අන්වර්ථ විධානය ක්‍රියාත්මක කරයි.

ඒක-ලයිනර් ලෙස මගේ කාර්යය මෙන්න:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

හෝ මනාව හැඩගස්වා ඇත:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

ඔබට එය ඔබගේ .bashrcගොනුවට එකතු කළ හැකිය, එය මූලාශ්‍ර කිරීමට අමතක නොකරන්න හෝ වෙනස්කම් සිදු කිරීමට ඔබේ පර්යන්ත සැසිය නැවත ආරම්භ කරන්න.


මෙයද sudo -H ll සඳහා වැඩ කරන්නේ නම් එය පුදුම සහගතය.
uav

4

ඇල්වින්ස් පිළිතුර කෙටිම එකයි. කිසිදු සැකයක් නැහැ! :-)

කෙසේ වෙතත් මම විධාන රේඛාව විසඳුමක් කල්පනා sudo දී aliased විධානය ක්රියාත්මක දක්වන ලෙසට අවශ්යතාවයක් නැත එහිදී sudoසමග aliasවිධාන.

උනන්දුවක් දක්වන අය සඳහා මගේ යෝජනාව මෙන්න:

විසඳුමක්

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

උදාහරණයක්

මෙම පිළිබඳ පැමිණිල්ලේ දී llවිධාන

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

පැහැදිලි කිරීම

ඔබට අන්වර්ථයක් ඇති විට (වැනි :) llවිධානය අන්වර්ථ type -aප්‍රකාශනය ලබා දෙයි:

$type -a ll
ll is aliased to `ls -l'

grepඔබ සමඟ උච්චාරණය `සහ අපෝස්තලාපය 'අතර ඇති පා select ය තෝරන්නls -l

හා xargsතෝරාගත් පෙළ ඉටු ls -lවන පරාමිතිය ලෙස sudo.

ඔව්, තව ටිකක් දිගු නමුත් සම්පූර්ණයෙන්ම පිරිසිදුයි ;-) sudoඅන්වර්ථය ලෙස නැවත අර්ථ දැක්වීමට අවශ්‍ය නැත .


4
ඔබ aliasබිල්ඩින් භාවිතා කළේ නම් එහි ප්‍රතිදානය වඩා පිරිසිදු බැවින් එය වඩාත් සරල විය හැකිය . alias llප්‍රතිදානයන් alias ll='ls -ahlF'.
මුරු

@ මුරුගේ යෝජනාව ඇතුළත් වන අනුවාදය මෙන්න : alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo.
ACK_stoverflow

මම හිතන්නේ මුල් ප්‍රශ්නයේ කාරණය වූයේ වැඩ නොකිරීම, sudo -iපළමුවෙන්ම නොපැමිණීම , අන්වර්ථ විධානය ක්‍රියාත්මක කිරීම, නමුත් එය කෙළින්ම කිරීමයි. එවැනි සංකීර්ණ විධානයක් තිබීම එය පරාජය කරයි. ඔබට කලින් කළ දේ කළ හැකි අතර ඉක්මන් විය හැකිය.
Evi1M4chine

1

මට තවත් හොඳ විසඳුමක් ඇත, එයද තරමක් විශ්වාසයක් එක් කරයි:

sudoටැබ් එබීමේදී පිටුපස ඇති වචන අන්වර්ථයන් සමඟ ස්වයංක්‍රීයව ප්‍රතිස්ථාපනය කිරීමට bash සම්පුර්ණ කිරීම භාවිතා කරන්න .

මෙය මෙසේ සුරකින්න /etc/bash_completion.d/sudo-alias.bashcomp, එය අන්තර්ක්‍රියාකාරී ෂෙල් ආරම්භයේදී ස්වයංක්‍රීයව පටවනු ලැබේ:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

ඉන්පසු නව පර්යන්තයකට පිවිසෙන්න, ඔබ යාමට හොඳ විය යුතුය.


අන්වර්ථ නාම ලැයිස්තුවක් ලබා ගැනීමට ක්‍රමයක් තිබේ, විශේෂයෙන් එය සම්පූර්ණ කිරීම සඳහා අදහස් කෙරේ:compgen -a
මුරු

ur මුරු: ස්තූතියි, නමුත් මේ අවස්ථාවේ මට අවශ්‍ය වන්නේ අගයන් මිස යතුරු නොවේ. එබැවින් ඇතුළත් කළ අන්වර්ථය ප්‍රතිස්ථාපනය වේ. ඔබ අන්වර්ථය ටයිප් කරන්න, (මෙන් sudo ll), [TAB press] ඔබන්න, සහ ස්ක්‍රිප්ට් llඅන්වර්ථ පැවරුම් ලැයිස්තුවෙන් සොයා ගනී , එයට පවරා ඇති දේ කපා, එය ඇතුල් කරයි. (එබැවින් ඔබට උදා sudo ls -lahvF --color=auto --time-style=long-iso.)
Evi1M4chine

1

E WinEunuuchs2Unix: $PWD"වර්තමාන වැඩ කරන නාමාවලිය" දක්වා විහිදේ . මම හිතන්නේ ඔබට අවශ්‍යයි $HOME.

එසේම, බොහෝ අවස්ථාවන් සඳහා, වෙනම root .bashrc ගොනුවක් තිබීම වඩාත් සුදුසුය. ඇත්ත වශයෙන්ම, මම එය සැබෑ ගොනු කරන්න කැමතියි /rootපරිශීලක නිවෙස් බහලුම (උදා, එය මෘදු, සබැඳිය, .bashrc_root), සහ පරිශීලක සිට එය ලබාගැනීමට .bashrcගොනුව. පසුකාලීනව මෙම වරප්‍රසාදිත පරිශීලක ගිණුම තවදුරටත් නොමැති නම්, මූල .bashrcගොනුව වෙනත් පරිශීලකයින් සඳහා තවමත් පවතී.


1

ඔබ sudo -iසුඩෝ විමසුමක් ටයිප් කර ඉහළට ඔසවා තැබුවහොත් ( #) ඔබ භාවිතා කිරීමට කැමති අන්වර්ථයන් හෝ කාර්යයන් ඔබට නොලැබේ.

ඔබගේ අන්වර්ථ නාම සහ කාර්යයන් #කඩිනමින් භාවිතා කිරීමට, භාවිතා කරන්න:

sudo cp "$HOME"/.bashrc /root/.bashrc

"OM HOME" "/ home / YOUR_USER_NAME" දක්වා පුළුල් වන තැන


@DKBose මා වෙනුවෙන් එය අල්ලා ගැනීම ගැන ස්තූතියි :)
WinEunuuchs2Unix

0

මට වෙනත් විසඳුමක් ඇත, එමඟින් ඔබට sudoඅන්වර්ථයක් ලෙස එකතු කිරීමට අවශ්‍ය නොවේ . මම ලිනක්ස් මින්ට් 17.3 ධාවනය කරන නමුත් එය උබුන්ටු වලට සමාන විය යුතුය.

ඔබ root වූ විට, .profileඑය ක්‍රියාත්මක වන්නේ එහි නිවාස නාමාවලියෙනි. මූල යටතේ ඇති නිවාස නාමාවලිය කුමක්දැයි ඔබ නොදන්නේ නම්, ඔබට මෙය පරීක්ෂා කළ හැකිය:

sudo su
echo $HOME

ඔබට පෙනෙන පරිදි, නිවහන rootවේ /root/. එහි අන්තර්ගතය පරීක්ෂා කරන්න:

cd $HOME
ls -al

.profileගොනුවක් තිබිය යුතුය . ගොනුව විවෘත කර පහත පේළි එක් කරන්න:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

මූලික වශයෙන්, මෙම bash ස්ක්‍රිප්ට් එක කරන්නේ ගොනුවක් සඳහා පරීක්ෂා කිරීමයි .bash_aliases. ලිපිගොනු තිබේ නම්, එය ගොනුව ක්‍රියාත්මක කරයි.

.profileගොනුව සුරකින්න සහ ඔබේ අන්වර්ථ නාමය සාදන්න .bash_aliases. ඔබ සතුව අන්වර්ථ ගොනුව දැනටමත් සූදානම් නම්, ගොනුව මෙම ස්ථානයට පිටපත් කරන්න

පර්යන්තය නැවත දියත් කරන්න, ඔබ යන්න හොඳයි!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.