Question

I'm trying to make an Applescript that connects to a list local ssh machines, with each connection opening in a new terminal window. Prior to attempting the ssh connection, I'd like to ping the client to see if it's available: if it is, run the ssh command, if not then iterates to the next client. When I run the script it seems to work for the first connection but then gives me --> error number -10004 for the remaining clients (and hangs the debugger). Any feedback would be greatly appreciated, thanks!

set hosts to {"10.2.0.199", "10.2.0.11", "10.2.0.91", "10.2.1.591", "10.2.0.41"}
set uname to {"asus_client01", "asrock_comp", "msi003", "gigabyte4", "intel05client"}
tell application "Terminal"
    activate
    repeat with i from 1 to the count of hosts
        set this_uname to item i of uname --extract individual username
        set this_host to item i of hosts as string --extract iPv4 
        set uname_host to this_uname & "@" & this_host
        set hostUp to true

        try
            do shell script "ping -c 1 -t 5 " & this_host
        on error
            set hostUp to false
            display dialog this_host & " seems to be down."
            delay 2
        end try

        if hostUp then
            do shell script "ssh " & uname_host
        end if
    end repeat
end tell
Was it helpful?

Solution

There is a difference between do shell script and do script. The difference is that do shell script is part of the standard script addition and will open an non-interactive shell, execute the given string, and return stdout back to you without any help from another application like Terminal. do shell script should never been used in any other tell application block except itself (me) because you violate some AppleScript securities you can find in AppleScript release and technical notes. do script command is part of AppleScript command in the application Terminal. do script will enter the given string in the targeted window and execute that like you have typed in Terminal yourself. do script is only supported by Terminal application and can't be used outside of it.

So it's either do shell script:

do shell script "ping -o stackoverflow.com

or do script by using the Terminal

tell application "Terminal"
    do script "ping -o stackoverflow.com"
end tell

So the total script could look something like this:

set hosts to {"10.2.0.199", "10.2.0.11", "10.2.0.91", "10.2.1.591", "10.2.0.41"}
set uname to {"asus_client01", "asrock_comp", "msi003", "gigabyte4", "intel05client"}

--security check: hosts list can't be longer than uname
if (count of hosts) > (count of uname) then return

repeat with i from 1 to count hosts
    repeat 1 times -- simulate continue
        set currentAddress to item i of hosts
        set currentHostname to item i of uname

        if not ((do shell script "ping -o -t 5 " & currentAddress & "&>dev/null && echo yes || echo no") as boolean) then
            exit repeat -- continue
        end if

        tell application "Terminal"
            do script "ssh " & currentHostname
        end tell
    end repeat
end repeat
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top