Control Your Mac from Afarby Harold Martin
There are many different ways to control your Mac -- even when you're not sitting at it. You might think that this level of flexibility would require special software. But no! If you're running Mac OS X, you'll be able to accomplish everything in this article without buying a single piece of software. As a bonus, you can also perform most of these tricks on the Mac you're sitting at right now. (Even though that wouldn't actually be remote controlling, now would it?)
The Tools We'll Use
ssh is the Secure SHell. It and its accompanying programs allow you
to securely log in and copy files to other computers running an
The target Mac must have OS X's built-in
ssh server enabled. You can
do this by checking "Remote Login" in the "Services" tab in the "Sharing"
System Preference pane.
ssh is the "remote" part in "remote control:" we use
ssh to log in to
the Mac that we want to control, and then use the other technologies
we'll talk about below to do the actual controlling. The computer you'll
use to control the target Mac should have an
ssh client. Most types of UNIX
(including OS X) come with an
ssh client, and clients are available
on just about every other platform, including Windows and OS 9. If you're
interested in learning more about
ssh, I recommend SSH,
The Secure Shell: The Definitive Guide.
Built-In CommandsOn top of the normal UNIX commands we'll use, Mac OS X has a couple of extra ones that will be particularly helpful to us:
openis a command that can open a file, directory, application, or URL from the command line, just as if it was double-clicked in the Finder.
screencaptureis a program that (surprise, surprise) takes a screen shot of what is on the computer's screen.
Session by Gordon Meyer:
Upgrade your digital life to include your house and living environment--controlling lights, temperature, music, and more--all from your Mac. We'll start with the basics of controlling lighting and other physical objects, then graduate to true automation which turns your home into a living entity that responds to, and anticipates, your needs.
Mac OS X Conference
AppleScript, as you probably know, can be used to control almost everything
on your Mac (now even more so, with GUI
Scripting). You can run AppleScripts from the command line with
osascript scriptname. You can also write scripts
on the fly with
osascript -e 'line 1' -e 'line 2'. This
is an amazing tool that we'll use a lot.
cron to run AppleScripts and commands automatically at set
In order for
osascript to work over
must have either
ssh'd in as the user currently running, or you must
run them with
sudo. In other words, if user Alice is logged
in at the actual machine and you
ssh in as Bob, you would need to run
sudo open file if you wanted
file to appear
on Alice's screen. On the other hand, if you logged in as Alice, you
would only have to run
open file. Keep this in mind; it's
tripped me up before.
Let's Do It!
Now that you've got your tools in order, I'll walk you through a few tricks to get you started with remote-controlling magic. Well, it's not really magic -- just some good old-fashioned UNIX and Apple technologies.
In OS X, open up Terminal and type:
ssh username@target's IP
Replacing the target's IP and the username you use on the target, as appropriate.
If you're using a non-UNIX
ssh client, check its documentation for instructions
on logging in.
After a successful login, you'll get a command prompt from which you'll execute the tricks below!
Seeing What the Target Is DoingTo start, go to the prompt and enter:
You'll see what processes are running, sorted by CPU usage. The processes
whose names end in
.app are OS X applications. If you want
to see just the applications, enter:
ps -aux | grep '.app'
ps will list all processes, and
grep will display
all of the lines that contain ".app".
Now, if you want to see exactly what the other computer is up to, you could enter:
screencapture -x ~/screen.pdf
This will take a screenshot (without the "camera click" sound) that will
be saved to the file screen.pdf. But how do you view it? By using
to copy the screenshot to your computer! If you're still in your
session, you should type:
scp ~/screen.pdf yourusername@yourIP:
substituting your username and IP. Be sure to have the "
:" at the end,
scp won't recognize that you want to copy to
An alternate way to get the screenshot is to exit your
ssh session and,
at your local prompt, type:
scp otherusername@target's IP:screen.pdf screen.pdf
Again, substitute the correct IP and username.
Either way, you'll end up with the screenshot file screen.pdf in your home directory, which you can look at and see exactly what the other computer was doing!
Communicating With the User of the Other Computer
Now, what if you want to say something to the person using the other
computer? To do this, we'll use the dynamic duo of
Logged in over
ssh, you can enter:
sudo osascript -e 'tell app "Finder" to activate' -e 'tell app "Finder" to display dialog "I see you!"'
All that this does is run a two-line (two
-es) script that activates
the Finder (which is necessary in order for the dialog to have some
place to appear) and then displays the dialog. You can use any AppleScript
you want, and you can also get the results of what the user on the target
Mac did. For example you could use something like this to let the user
talk back to you:
sudo osascript -e 'tell app "Finder" to activate' -e 'tell app "Finder" to display dialog "What would you like to say?" default answer ""'
In the text printed out over the
ssh session, you will see a line like
"text returned:Hi!, button returned:OK". The text returned will be what
the user typed back.
But what if you actually wanted to talk to the user, with a voice? You would enter this:
A couple of notes, though: I've sometimes had problems using speech with
sudo osascript -e 'say "Now I can watch you and talk to you"'
sudo, so you might also want to try this without
sudo. Also keep in mind that this will have no effect if the target Mac is muted. You might want to use
display dialogfor maximum effect!
Closing and Opening Applications
Think back to the discussion of seeing what the target Mac is doing.
What if you see an application that you want to close? From the listing you
ps -aux, you can get an application's process
ID (PID). You can then take that PID and pass it to the
I've found this to be particularly useful when an application won't quit
(even with force quit) or when it's in fullscreen mode (like a game).
I can just log in from another machine and quit the wayward app, then
get back to work. If something freezes so bad that normal
well, kill it (a rarity) then you can use "super" kill:
kill -9 PID
The only problem with
killing an app is that it will immediately
close down, giving the user no chance to save any open documents first.
What if you would like to close down the application in a kinder manner?
AppleScript to the rescue! You can quit TextEdit and still allow the
user to save his changes by entering:
osascript -e 'tell app "TextEdit" to quit'
Be careful, though; if TextEdit isn't already open, then this script will
cause it to open and then quit. Use
ps to make sure TextEdit
(or whatever application) is open in the first place. Also keep in mind
that the user can simply click the Cancel button to keep the app from
Shutting Down or Rebooting
Suppose you want to shut down or reboot the computer. As before, there's the immediate UNIX way and the kinder (but user-cancelable) AppleScript way. The command-line way to shut down is:
sudo shutdown -h now
This will close your
ssh session and shut down the computer, regardless
of any apps or documents that may be open. To reboot, simply enter:
Again, this will close everything down without mercy. To give the user a chance to save what they're doing (and yes, to cancel the shutdown) you can type:
osascript -e 'tell app "Finder" to shut down'
osascript -e 'tell app "Finder" to reboot'
to shut down and reboot, respectively. The only way a user can cancel this is to keep an application open long enough that the shutdown or reboot times out. But at least it won't give the user the "Are you sure you want to shut down your computer now?" dialog!
Using AppleScript GUI Scripting to Control any Application
Apple has released a beta scripting engine, called GUI Scripting, that allows AppleScripts to take full control of any application by directly interacting with its GUI elements (such as menus and buttons). First, download it from Apple's GUI Scripting page. There are also some example GUI scripts there that you should look over. Here is a simple script that puts the computer to sleep, something that can't be accomplished via the Finder's AppleScript dictionary or with regular UNIX commands:
try tell application "Finder" activate end tell tell application "System Events" with timeout of 30 seconds tell process "Finder" tell menu bar 1 click menu item "Sleep" of menu "Apple" end tell end tell end timeout end tell end try
You should save this script it as sleep.scpt, preferably in a hidden directory (such as ~/.applescripts). The next time you log in, you can just enter:
though putting the computer to sleep will freeze your
GUI Scripting will probably end up being one of the most useful tools in your toolbox, as what you can accomplish with it is (nearly) infinite, at least as far as controlling your Mac goes.
Automating Your Remote Control
Now that we've covered how to use a variety of UNIX commands and AppleScripts to control your Mac, there's only one major obstacle left to complete control: you have to be at a computer to do the controlling. Wouldn't it be nice if you could tell your Mac to take control of certain things at certain times?
Enter cron, the age-old UNIX command-scheduling tool. If
you don't know how to use
cron, you should read this
tutorial or Chris Stone's "Learning
the Terminal in Jaguar." Don't worry,
cron is actually
Since you can't be sure which user (in any) will be logged on when the
cron job runs, you have to edit root's crontab.
With that in mind, you can grab your favorite UNIX text editor, run it
sudo, and edit /etc/crontab; or, you can use a GUI tool like CronniX.
The only difference between CronniX and /etc/crontab is that in CronniX
you don't use the
who field. If you choose to use CronniX,
you open root's crontab by clicking Open and typing in
for the username.
* * * * * root sudo osascript -e 'tell app "Finder" to activate' -e 'tell app "Finder" to display dialog current date as string'
Though of course, you would never put that in your crontab, since it would drive you as well as all of your users crazy
Full Remote GUI Control
Finally, if you want complete control over the GUI, there's VNC. VNC allows you to open a window that shows the exact the desktop of the other computer, so you can move the other user's mouse, type in their dialog boxes, and otherwise annoy them. OSXvnc and Chicken of the VNC are my favorite server and client, respectively. After launching your VNC server, you can use any computer that has VNC client to log in and do your remote controlling. The biggest downside to VNC (and the reason it is not covered more extensively here) is that it is totally interactive and is difficult (if not impossible) to automate.
You're well on your way to automating and controlling your Mac. Using both old and new tools, you should be able to use your Mac whether you're sitting in front of it, on another computer, or letting it execute timed tasks itself. Read sites like Mac OS X Hints and O'Reilly Hacks (and their books Mac OS X Hints: Jaguar Edition and Mac OS X Hacks) to find more tricks you can use.
With all the possibilities, I'll be excited to see what you come up with. Post your experiences and ideas in the Talkback section below!
Return to the Mac DevCenter