macos - iterm2 tcsh
Envío de comandos y cadenas a Terminal.app con Applescript (15)
¿Qué tal algo así?
tell application "Terminal"
activate
do shell script "sudo dscl localhost -create /Local/Default/Hosts/cc.josmoe.com IPAddress 127.0.0.1"
do shell script "sudo dscl localhost -create /Local/Default/Hosts/cc.josmos2.com IPAddress 127.0.0.1"
end tell
Quiero hacer algo como esto:
tell application "Terminal"
activate
do script "ssh [email protected]"
-- // write user''s password
-- // write some linux commands to remote server
end tell
Por ejemplo, para iniciar sesión en el servidor, ingrese la contraseña y luego inicie sesión en mysql y seleccione una base de datos.
Escribo eso todos los días y sería muy útil incluirlo en un script.
Además, ¿hay alguna referencia de qué comandos, propiedades, funciones, etc. tienen las aplicaciones (Terminal, Finder, etc.) disponibles para usar dentro de Applescript? ¡Gracias!
EDITAR : Permítanme aclarar esto: no quiero hacer varios ''do script'' como lo intenté y no funciona. Quiero abrir una ventana de Terminal, y luego emular un tipeo humano en algunos caracteres y presionar enter. Podrían ser contraseñas, podrían ser comandos, lo que sea, simplemente enviar chars a la Terminal que está ejecutando ssh. Intenté pulsar la tecla y parece que no funciona.
¿Qué tal esto? No hay necesidad de códigos clave (al menos en Lion, no estoy seguro de lo anterior), y una subrutina simplifica el script principal.
La secuencia de comandos siguiente se ssh a localhost como usuario "me", ingrese la contraseña "myPassw0rd" después de un retraso de 1 segundo, emita ls, espere 2 segundos y luego salga.
tell application "Terminal"
activate
my execCmd("ssh me@localhost", 1)
my execCmd("myPassw0rd", 0)
my execCmd("ls", 2)
my execCmd("exit", 0)
end tell
on execCmd(cmd, pause)
tell application "System Events"
tell application process "Terminal"
set frontmost to true
keystroke cmd
keystroke return
end tell
end tell
delay pause
end execCmd
Aquí hay otra manera, pero con la ventaja de que lanza Terminal, lo trae al frente y crea solo una ventana.
Me gusta esto cuando quiero que me presenten los resultados de mi script.
tell application "Terminal"
activate
set shell to do script "echo 1" in window 1
do script "echo 2" in shell
do script "echo 3" in shell
end tell
Como EvanK indicó que cada línea de script do abrirá una nueva ventana, sin embargo, puede ejecutar
dos comandos con el mismo do script separándolos con un punto y coma. Por ejemplo:
tell application "Terminal"
do script "date;time"
end tell
Pero el límite parece ser dos comandos.
Sin embargo, puede agregar "en la ventana 1" al comando do script (para cada secuencia de comandos do después de la primera) para obtener el mismo efecto y continuar ejecutando tantos comandos como necesite en la misma ventana:
tell application "Terminal"
do script "date"
do script "time" in window 1
do script "who" in window 1
end tell
Tenga en cuenta que acabo de utilizar el comando who, date y time como ejemplo ... reemplace con los comandos que necesite.
Como buena solución, prueba-
$ open -a /Applications/Utilities/Terminal.app *.py
o
$ open -b com.apple.terminal *.py
Para el shell lanzado, puede ir a Preferencias> Shell> configurarlo para salir si no hay error.
Eso es.
Construí este script Está en Yosemite y es script bash usando AppleScript para elegir una lista de usuarios para servidores SSH. Básicamente, usted define una IP y luego los nombres de los usuarios ... cuando la aplicación se inicia, le pregunta en quién desea iniciar sesión, ya que ... el terminal SSH se inicia y se registra solicitando una contraseña ...
(***
* --- --- --- --- ---
* JD Sports Fashion plc
* Apple Script
* Khaleel Mughal
* --- --- --- --- ---
* #SHELLSTAGINGSSHBASH
* --- --- --- --- ---
***)
set stagingIP to "192.162.999.999"
set faciaName to (choose from list {"admin", "marketing", "photography_cdn"})
if faciaName is false then
display dialog "No facia was selected." with icon stop buttons {"Exit"} default button {"Exit"}
else
set faciaName to (item 1 of faciaName)
tell application "Terminal"
activate
do script "ssh " & faciaName & "@" & stagingIP & ""
end tell
end if
Lo recomiendo sin embargo; Nathan Pickmans publica más arriba sobre Shuttle ( http://fitztrev.github.io/shuttle/ ) ... una aplicación muy inteligente y simple.
El último ejemplo muestra errores debajo de 10.6.8 (Build 10K549) causados por la palabra clave "pause".
Sustituirlo por la palabra "esperar" lo hace funcionar:
tell application "Terminal"
activate
my execCmd("ssh me@localhost", 1)
my execCmd("myPassw0rd", 0)
my execCmd("ls", 2)
my execCmd("exit", 0)
end tell
on execCmd(cmd, wait)
tell application "System Events"
tell application process "Terminal"
set frontmost to true
keystroke cmd
keystroke return
end tell
end tell
delay wait
end execCmd
No necesita "decirle" a Terminal que haga nada. AppleScript puede hacer scripts de shell directamente.
set theDir to "~/Desktop/"
do shell script "touch " & theDir &"SomeFile.txt"
o lo que sea ...
Petruza,
En lugar de usar la tecla, use el código de tecla.
El siguiente ejemplo debería funcionar para usted.
tell application "System Events"
tell application process "Terminal"
set frontmost to true
key code {2, 0, 17, 14}
keystroke return
end tell
end tell
El ejemplo anterior enviará los caracteres {date} a Terminal y luego
retorno de tecla entrará y ejecutará el comando. Usa el ejemplo de arriba
con los códigos clave que necesita y podrá hacer lo que está tratando de hacer.
Podría estar equivocado, pero creo que la integración de Applescript Terminal es un acuerdo de una sola vez ... Es decir, cada llamada de do script
es como abrir una ventana de terminal diferente, así que no creo que puedas interactuar con ella en absoluto.
Puede copiar las claves públicas SSH para evitar la solicitud de contraseña, luego ejecutar todos los comandos unidos ( advertencia: lo siguiente no se ha probado ):
tell application "Terminal"
activate
do script "ssh [email protected] ''/home/jdoe/dosomestuff.sh && /home/jdoe/dosomemorestuff.sh''"
end tell
Alternativamente, puede ajustar los comandos ssh y subsiguientes en un script de shell usando Expect , y luego invocar dicho script de shell desde su Applescript.
Por qué no usar expect:
tell application "Terminal"
activate
set currentTab to do script ("expect -c ''spawn ssh user@IP; expect /"*?assword:*/"; send /"MySecretPass
/"; interact''")
end tell
Primero, conéctese al servidor y espere 6 segundos (puede cambiar eso) y luego ejecute lo que necesite en el servidor remoto con la misma pestaña
tell application "Terminal"
set currentTab to do script ("ssh user@server;")
delay 6
do script ("do something remote") in currentTab
end tell
Su pregunta es específicamente sobre cómo hacer que AppleScript haga lo que quiera. Pero, para el ejemplo particular descrito, es posible que desee considerar ''esperar'' como una solución.
Un poco relacionado, es posible que desee ver Shuttle ( http://fitztrev.github.io/shuttle/ ), es un menú de acceso directo SSH para OSX.
configure ssh sin contraseña ( ssh-keygen
, luego agregue la clave a ~/.ssh/authorized_keys
en el servidor). Realice una entrada en ~/.ssh/config
(en su escritorio), de modo que cuando ejecute ssh mysqlserver, vaya al usuario @ hostname ... O cree un alias de shell, como gotosql, que se expanda a ssh user@host -t ''mysql_client ...''
para iniciar el cliente mysql de manera interactiva en el servidor.
Entonces probablemente necesites la respuesta de otra persona para guiar el proceso después de eso, ya que no sé cómo configurar comandos de inicio para mysql.
¡Al menos eso mantiene su contraseña de ssh fuera de la secuencia de comandos!