Occasionally I need to edit system files that belong to root and I found that it can be quite annoying as I always end up using nano in the terminal as it doesn’t seem possible to elevate the privileges of an application from Finder. For example if I wanted to edit my /etc/hosts file then usually I’d have to drop to a shell and type:
[code]]czoyMDpcInN1ZG8gbmFubyAvZXRjL2hvc3RzXCI7e1smKiZdfQ==[[/code]
The problem with that is that I have a nice looking graphical operating system here and although I love the fact that it uses unix under the bonnet, I really much prefer to edit my files in TextEdit rather than a console based application like nano. I could use the open command like this:
[code]]czozMjpcInN1ZG8gb3BlbiAtYSBUZXh0RWRpdCAvZXRjL2hvc3RzXCI7e1smKiZdfQ==[[/code]
but then I just have my default user privileges and I can’t save it, even though I used sudo! The correct solution is actually to use:
[code]]czo3NDpcInN1ZG8gb3BlbiAtYSAvQXBwbGljYXRpb25zL1RleHRFZGl0LmFwcC9Db250ZW50cy9NYWNPUy9UZXh0RWRpdCAvZXRjL2h7WyYqJl19b3N0c1wiO3tbJiomXX0=[[/code]
The reason for this is that an application in OS X is actually a folder that contains all the necessary files and resources that it uses, and the executable file itself is buried in a couple of subfolders. Neat and tidy, but a bit of a pain to type in the terminal!
I decided I’d make my own sudo / open script which I creatively named sopen.
#!/bin/bash
if [ $# -lt 1 ]
then
me=`basename $0`
echo "Usage: $me [OSX Application]"
exit
fi
myPath=/Applications:/Applications/Utilities:/Developer/Applications:$PATH
myPath=\"`echo $myPath | sed 's/:/" "/g'`\"
# Check our custom path and execute the first match
for thisPath in $myPath
do
thisPath="`echo $thisPath | sed 's/\"//g'`"
app=$thisPath/$1.app/Contents/MacOS/$1
if [ -x "$app" ]
then
# We found it!
shift
sudo -b "$app" $*
exit
fi
done
# We didn't find anything.
echo 'Sorry, application not found.'
I saved that file to /usr/local/bin/sopen (using nano
) and then gave it execute permission using chmod.
[code]]czoyOTpcImNobW9kIC14IC91c3IvbG9jYWwvYmluL3NvcGVuXCI7e1smKiZdfQ==[[/code]
I could have also granted the execute permission from Finder but I was in a terminal anyway. Now, although I still need to drop to a terminal in order to edit my system files, all I need to type is
[code]]czoyNTpcInNvcGVuIFRleHRFZGl0IC9ldGMvaG9zdHNcIjt7WyYqJl19[[/code]
My script will look for the specified program in /Applications, /Applications/Utilities, /Developer/Applications and then continue on down the regular $PATH. It’ll execute the first correctly-named program it finds and will pass to it any extra parameters that I specify on the command line. So the above example will correctly sudo /Applications/TextEdit and will pass it /etc/hosts.
This is just a very simple script and it could be expanded on to perhaps work a bit more like open and use LaunchServices to find a default program to open a certain file type but I’m happy with the way it is. Maybe others will find it useful too. Perhaps when I get time I’ll write a Finder plugin to let me elevate from a popup menu and then I can do away with the console completely.


Posted in
Tags: 

[...] скрипта назвал его sopen, файл сохранил в /usr/local/bin, далее надо [...]