Have you ever done the following?
duk is a function that will show you directory sizes under a given pathname (or the current directory), nicely sorted by size, largest at the bottom just above your next prompt. It's very handy, put it in your .bashrc ;-). sudo doesn't know what to do with "duk" however, since it's not a system command. Therefore, I wrote a function that is a front-end to sudo. It parses the command line you give it, and expands any functions or aliases that you call. For bonus points, it shows you the full command line as the shell receives it before you type your password. Use it as follows:$ type duk duk is a function duk () { du -k "$@" | sort -n } $ sudo duk /tmp sudo: duk: command not found
Looks like I'll need to do some cleaning up in /tmp. Full source follows. To use it, place a source ~/.sudo.bash (for example) in your .bashrc after copying the code to your ~/.sudo.bash, or copy the full code to your .bashrc. Then, simply use sudo as you would before. This function handles all sudo arguments. There is one extra argument, -x, which expands arguments as you, not as root. This is needed in some corner cases. (Update: New version which no longer uses sed and handles spaces in sudo options!)$ source sudo.bash $ sudo duk /tmp /opt/local/bin/sudo -- bash -x -v -c duk () { du -k "$@" | sort -n };"duk" '/tmp' Password:[...]3648 /tmp/synergy-1.3.1/lib 6184 /tmp/synergy-1.3.1 20128 /tmp/prarora 1294048 /tmp/tmp 5304016 /tmp
# Wrap sudo to handle aliases and functions # Wout.Mertens@gmail.com # # Accepts -x as well as regular sudo options: this expands variables as you not root # # Comments and improvements welcome # # Installing: source this from your .bashrc and set alias sudo=sudowrap # You can also wrap it in a script that changes your terminal color, like so: # function setclr() { # local t=0 # SetTerminalStyle $1 # shift # "$@" # t=$? # SetTerminalStyle default # return $t # } # alias sudo="setclr sudo sudowrap" # If SetTerminalStyle is a program that interfaces with your terminal to set its # color. # Note: This script only handles one layer of aliases/functions. # If you prefer to call this function sudo, uncomment the following # line which will make sure it can be called that #typeset -f sudo >/dev/null && unset sudo sudowrap () { local c="" t="" parse="" local -a opt #parse sudo args OPTIND=1 i=0 while getopts xVhlLvkKsHPSb:p:c:a:u: t; do if [ "$t" = x ]; then parse=true else opt[$i]="-$t" let i++ if [ "$OPTARG" ]; then opt[$i]="$OPTARG" let i++ fi fi done shift $(( $OPTIND - 1 )) if [ $# -ge 1 ]; then c="$1"; shift; case $(type -t "$c") in "") echo No such command "$c" return 127 ;; alias) c="$(type "$c")" # Strip "... is aliased to `...'" c="${c#*\`}" c="${c%\'}" ;; function) c="$(type "$c")" # Strip first line c="${c#* is a function}" c="$c;\"$c\"" ;; *) c="\"$c\"" ;; esac if [ -n "$parse" ]; then # Quote the rest once, so it gets processed by bash. # Done this way so variables can get expanded. while [ -n "$1" ]; do c="$c \"$1\"" shift done else # Otherwise, quote the arguments. The echo gets an extra # space to prevent echo from parsing arguments like -n while [ -n "$1" ]; do t="${1//\'/\'\\\'\'}" c="$c '$t'" shift done fi echo sudo "${opt[@]}" -- bash -xvc \""$c"\" >&2 command sudo "${opt[@]}" bash -xvc "$c" else echo sudo "${opt[@]}" >&2 command sudo "${opt[@]}" fi } # Allow sudowrap to be used in subshells export -f sudowrap
12 comments:
I think you might want to add "--" to the du command, like so:
du -k -- "$@" | sort -n
This will stop the script failing on any filename starting with a dash. As an example why one would have a filename with dashes in it, I like to "touch /-i" on important machines as a last ditch effort to catch a haywire "rm -r".
Nice wrapper for sudo!
Wow, I totally missed this comment. Thanks for those 2 hints, good ones!
Using this with commands that are completely unavailable for the current user, will not work.
For instance with ifconfig:
$ sudo ifconfig
No such command ifconfig
@FiXato: actually if you do that without this function, it would still not work:
sudo: ifconfig: command not found
You need to fully qualify the command or have it in your path, e.g. sudo /sbin/ifconfig.
Thanks much for this script! Makes using aliases a lot simpler.
It's simply excellent, thanks a lot !
Cool, thanks! A few comments:
1. Doesn't survive set -o nounset. Initializing on local line fixes that:
local c="" o="" t="" parse=""
2. Doesn't work with multi-word prompt, like sudo -p "Ur pass?" function. No work around yet.
3. Should return sudo's exit code for API compatibility. return $? handles that
Hi Bishop,
thanks for the comments.
1: Fixed, thanks!
2: Fixed :-)
3: It already does that since the sudo is last in the function, are you returning the value in your wrapper? See example in the comments.
Thanks! On #3, that's right, I always forget the last command's exit code is the function exit code. I guess it's just a matter of preference for me, to be explicit. :)
Please have a look at http://serverfault.com/a/423546/107998 for an alternative solution to this issue
gay porno
Post a Comment