Call osascript through perl in OSX 10.9 doesn't work anymore - macos

I'm writing an application for Mac (OSX, not iOS).
The installation runs a perl script which contains some "osascript" call, for example:
$res = qx(osascript -e 'launch application "MyApp"');
Or:
$res = qx(osascript -e 'tell application "System event" to make login item at end with properties {path:".... .app", hidden: false}');
and more...
I have two Mac machines, one with OSX 10.9 and other with OSX 10.7.
When I'm running the installation on OSX 10.7 - All works good.
When I'm running the installation on OSX 10.9 - the call to osascript doesn't work (all of them, not only one). I tried to run only the osascript command in terminal, and it works!
The installation process done from user (not admin) but ask for admin permission during the installation.
Someone know what have been changed in the new OSx?
Thanks!

Related

How to Lock (not sleep) my Mac using NSAppleScript or any other command that can be executed from a Mac app

In my Mac app i am trying to lock my Mac based on some actions in my app. Until now i have only got a way to put it to sleep but not lock.
Currently i am doing this :
let appleScript = NSAppleScript(source: "tell application \"Finder\" to sleep")
appleScript?.executeAndReturnError(nil)
Please guide.
Instead of
tell application "Finder" to sleep
Use the following:
do shell script "/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -suspend"
You will need to escape the " characters with \ as you have already with the Finder command.

Computer Shut Off Python 3.4

A friend of mine wants to automatically shut off his computer using Python 3.4 (to put in a program). Does anyone know a basic as-small-as-possible way to do this?
OS:
Mac OSX Yosemite
Thanks
OS X is a Unix at its base, so you can use Unix commands. you can use either:
#!/usr/bin/python
import os
os.system("shutdown -h now")
Must be run as root, won't work otherwise. You can however add to sudoers (man visudo) shutdown as NOPASSWD program for the users that want to execute the script and use sudo shutdown … instead of just shutdown…
or
import subprocess
subprocess.call(['osascript', '-e',
'tell app "System Events" to shut down'])

Applescript fails with error (-600) when launched over ssh on Mavericks

I've tried searching for this, and have seen others with similar problems but don't seem to have found an answer anywhere....
I have an AppleScript that I am trying to run over ssh so that I can remotely control my mac. This has worked previously with OSX 10.8 but no longer seems to work since upgrading to 10.9.
The command I am executing is:
ssh <user>#mymac.local "osascript -e 'tell application \"iTunes\" to play'"
I have already set up RSA keys so the ssh session opens correctly
I am connecting as the same user that the Mac is currently logged in and running under
iTunes is running on the Mac with that user at the time the script is launched
The script fails, coming back with:
execution error: iTunes got an error: Application isn’t running. (-600)
Similarly, a number of other scripts that I had previously been using also seem to now be broken on 10.9 with the same error, so this seems to be related to the fact that it's running over ssh, rather than an issue with iTunes or a specific application.
I've tried packaging the applescripts as applications, saving them on the remote Mac, and then opening them from within an ssh session, but this also fails:
ssh <user>#mymac.local
open "~/Desktop/Play Music.app"
(Where 'Play Music.app') is an applescript exported as an app).
This does not report an error within the ssh session, but an applescript dialog appears on the remote mac:
I also have several scripts that were scheduled with crontab on my Mac, and these are also failing since upgrading.
I assume this is some sort of security change as part of Mavericks, but I can't seem to find a way to make it work again. Does anyone have any solutions to this?
Application isn’t running(-600) is an operating system error.
An operating system error is an error that occurs when AppleScript or
an application requests services from the Mac OS. They are rare, and
often there is nothing you can do about them in a script, other than
report them.
Arrrrgh! I don't want this to be the answer, but after trying just about everything, this now seems to be working after a restart.... My guess is that something in appleeventsd got confused (although restarting just appleeventsd on its own didn't fix anything). After a restart osascript seems to be behaving again. I'm still not convinced this is fully fixed, but it does seem to be working for the moment...
For me, it was Apple Entitlements in Xcode.
Specifically,
com.apple.security.temporary-exception.apple-events
Set it as an Array
Then add two items to it.
com.apple.finder
com.apple.iTunes
See: My applescript doesn't work any more when I upgrade my OS X to 10.9
Apple Script may not be the issue. Assistive devices could be what is causing this.
Enable access for assistive devices and applications by opening System Preferences > Security & Privacy > Privacy > Accessibility and check the applications you want to allow access.
for me this happened when I tried to open gitk. Changing back to the branch I was on before, and gitk was able to open again
On my computer, with an uptime of 162 days, killing appleeventsd fixed the problem. I think appleeventsd and long uptimes is a bad combination.
System Events is a really finicky asshat component of OS X. Here is my method for getting around that dreaded "Application isn't running -600" error:
set app_name to "System Events"
set the_pid to (do shell script "ps ax | grep " & (quoted form of app_name) & "$
if the_pid is not "" then do shell script ("kill -9 " & the_pid)
tell application "System Events"
-- activate
end tell
I kill "System Events" with a kill -9 and then relaunch it.
#benmarbles code seems to be missing something at the end of line 2 -- it won't even compile.
Anyhow, I've seen the same issue with "Image Events" and I solved it with a simplified version of that script. Here's how I handle it:
tell application "System Events" to set thePID to (unix id of process "Image Events")
set killCMD to ("kill -9 " & thePID) as text
do shell script killCMD with administrator privileges
Replace Image Events with System Events to kill that process instead. The System Events process keeps itself alive, so there's no need to do anything to relaunch it.
I got the same error when I was unable to do GUI Scripts, but changing the System Preferences > Security & Privacy > Privacy > Accessibility settings for that specific app and adding a delay 0.5 between each line corrected it!
I was confused by this message "for System Events" not working in newer versions of Mac OS X from the command line:
osascript -e 'tell application "System Events" to display dialog "Build finished"'
It turns out the syntax of Applescript is (changed to?) just:
osascript -e 'display dialog "Build finished"'
Hello from 2k19 :) The approach below has helped to me
tell app "app_name"
launch
delay 2
end tell
tell app "app_name"
do something usefull
end tell
or
osascript -e "tell app \"app_name\"" -e "launch" -e "delay 2"-e "end tell" -e "tell app \"app_name\"" -e "do someting usefull" - e "end tell"
For my issue resolved by enable access for AEServer by opening System Preferences > Security & Privacy > Privacy > Accessibility
You will also get this error if you run the script as the wrong user via ssh - make sure you are logged in as the same user you want to script.
I killed the "System Events" process from Activity Monitor and then my ssh script worked. "System Events" was restarted as a result. I'm guessing it just got into a messed up state.
For me, the line:
tell application "Contacts"
failed with the error -600 only if the Contacts app was already open (most of the time it worked, but I noticed it only failed when the app was running).
I have added:
killall Contacts
in the bash (or zsh) script calling osascript and now I don't get the issue any more.

Execute a Terminal Command using AppleScript (Mountain Lion)

This used to work in pre-Mountain Lion OS X:
tell application "Terminal"
activate
do script "cd /"
end tell
Now, the new bash window is opened, but nothing is executed, no mater what the command-line script.
It's broken on the few systems I've tried it on, but is it a general problem? Is there a workaround?
Works as expected for me.
Any recent changes to your environment or .bashrc?
bash$ cat t.applescript
tell application "Terminal"
activate
do script "cd /"
end tell
 
bash$ osascript t.applescript
tab 1 of window id 9766
 
New Terminal window opens, "cd /" is visible in buffer, and shell is at /.
bash$ uname -smr
Darwin 12.2.0 x86_64
Edit: verified on 10.8.3 too
bash$ uname -smr
Darwin 12.3.0 x86_64
Check Terminal.app's Preferences, there are many options for new windows and what Shell to open at startup and many more–

How can I detect if the screen is locked or screensaver is active from the Terminal in OS X 10.6?

Due to the new limitations of Kerberos in OS X 10.6, I'm working on a script that offers similar functionality to what used to be available in 10.5. Essentially it parses the klist output to see if your ticket is expiring and displays how long until it expires. If we hit the 10 minute mark, it calls kinit to do a GUI password prompt to ask for your kerberos password. If the ticket is expired it does the same thing.
The script makes sure that kinit is not running before calling it again so we don't have multiple kinit calls, and the script works really great (called out of GeekLog so you can see the status). Problem is this morning my system was giving the spinning beachball when I went to unlock the screen. I am suspecting my script and/or kinit from doing something; the machine was available via ping, but otherwise unresponsive to ssh or AFP.
So what I want to do is detect whether or not the screen is locked or the screensaver is engaged. I've found that on previous versions of OS X, you could grep for ScreenSaverEngine to determine whether it was active or not, but that doesn't seem to be the case any longer.
So how can I determine if the screen is locked or otherwise engaged using commandline tools? If the screen is locked, I want the script to simply exit so it doesn't bother with the klist or try to do a kinit. I'm hoping that will prevent the lockup I experienced this morning. Any ideas?
A bit of a kludge but you can easily query the System Events background app via Apple Events to tell if a screen saver is running. For example:
$ osascript -e 'tell application "System Events"' \
> -e 'get running of screen saver preferences' \
> -e 'end tell'
false
$ # engage screen saver after starting next command
$ sleep 5; osascript -e 'tell application "System Events"' -e 'get running of screen saver preferences' -e 'end tell'
true
$
You probably really need to find out why you're getting the lock up, though.
Just out of curiosity, have you tried ssh'ing into the OS X machine and compare the process list before/after the screen saver / lock ?
That's what I'd try.

Resources