Отправка команд и строк в Terminal.app с помощью Applescript - программирование
Подтвердить что ты не робот

Отправка команд и строк в Terminal.app с помощью Applescript

Я хочу сделать что-то вроде этого:

tell application "Terminal"
  activate
  do script "ssh [email protected]"
  -- // write user password
  -- // write some linux commands to remote server
end tell

Например, чтобы войти на сервер, введите пароль, а затем войдите в mysql и выберите БД.
Я печатаю это каждый день, и было бы действительно полезно связать его с script.

Кроме того, есть ли ссылка на какие команды, свойства, функции и т.д. приложения (Terminal, Finder и т.д.) доступны для использования в Applescript? спасибо!

EDIT. Позвольте мне прояснить это: Я не хочу делать несколько "do script", как я пытался и не работает. Я хочу открыть окно терминала, а затем подражать человеку, набирая некоторые символы и нажимая кнопку enter. Могут быть пароли, могут быть командами, что угодно, просто отправляя символы в терминал, который, как оказалось, запускает ssh. Я пробовал нажатие клавиши и, похоже, не работал.

4b9b3361

Ответ 1

Сначала подключитесь к серверу и подождите 6 секунд (вы можете это изменить), а затем выполните все, что вам нужно, на удаленном сервере, используя ту же вкладку

tell application "Terminal"
   set currentTab to do script ("ssh [email protected];")
   delay 6
   do script ("do something remote") in currentTab
end tell

Ответ 2

Как указано в EvanK, каждая строка script откроет новое окно, однако вы можете запустить две команды с тем же самым script, разделив их точкой с запятой. Например:

tell application "Terminal"
    do script "date;time"
end tell

Но предел представляется двумя командами.

Однако вы можете добавить "в окне 1" к команде do script (для каждого do script после первого), чтобы получить тот же эффект и продолжить выполнение как можно большего количества команд в то же окно:

tell application "Terminal"
    do script "date"
    do script "time" in window 1
    do script "who" in window 1
end tell


Обратите внимание, что я просто использовал команду who, date и time в качестве примера... replace с любыми командами, которые вам нужны.

Ответ 3

Здесь другой способ, но с тем преимуществом, что он запускает Terminal, выводит его на передний план и создает только одно окно.

Мне нравится это, когда я хочу быть аккуратно представлен результатами моего 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

Ответ 4

Как насчет этого? Нет необходимости в кодах клавиш (по крайней мере, в Lion, не уверенном ранее), а подпрограмма упрощает основной script.

Ниже script будет ssh на localhost в качестве пользователя "я", введите пароль "myPassw0rd" после 1 секунды задержки, введите ls, задержка 2 секунды и затем выйдите.

tell application "Terminal"
    activate
    my execCmd("ssh [email protected]", 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

Ответ 5

Вам не нужно "сообщать" терминалу что-либо делать. AppleScript может напрямую выполнять сценарии оболочки.

set theDir to "~/Desktop/"
do shell script "touch " & theDir &"SomeFile.txt"

или что-то еще...

Ответ 6

С уважением, вы можете посмотреть Shuttle (http://fitztrev.github.io/shuttle/), это контекстное меню SSH для OSX.

Ответ 7

Ваш вопрос конкретно о том, как заставить Applescript делать то, что вы хотите. Но, для конкретного описанного примера, вы можете захотеть заглянуть в "ожидание" в качестве решения.

Ответ 8

Почему бы не использовать expect:

tell application "Terminal"
    activate
    set currentTab to do script ("expect -c 'spawn ssh [email protected]; expect \"*?assword:*\"; send \"MySecretPass
\"; interact'")
end tell

Ответ 9

Я мог ошибаться, но я думаю, что интеграция с Applescript Terminal - это одноразовая сделка... То есть каждый вызов do script похож на открытие другого окна терминала, поэтому я не думаю, что вы можете с ним взаимодействовать на всех.

Вы можете скопировать поверх открытых ключей SSH, чтобы предотвратить приглашение пароля, затем выполнить все команды, объединенные вместе (предупреждение: следующее непроверено):

tell application "Terminal"
    activate
    do script "ssh [email protected] '/home/jdoe/dosomestuff.sh && /home/jdoe/dosomemorestuff.sh'"
end tell

В качестве альтернативы вы можете обернуть ssh и последующие команды в оболочке script с помощью Expect, а затем вызвать оболочку script из вашего Applescript.

Ответ 10

настройте passwordless ssh (ssh-keygen, затем добавьте ключ к ~/.ssh/authorized_keys на сервере). Сделайте запись в ~/.ssh/config (на рабочем столе), чтобы при запуске ssh mysqlserver она перешла к user @hostname... Или создайте псевдоним оболочки, например gotosql, который расширяется до ssh [email protected] -t 'mysql_client ...', чтобы запустить клиент mysql интерактивно на сервере.

Тогда вам, вероятно, нужно, чтобы кто-то еще ответил на script процесс после этого, так как я не знаю, как установить команды запуска для mysql.

По крайней мере, ваш пароль ssh из script!

Ответ 11

Petruza,

Вместо использования клавиши key code.
Следующий пример должен работать на вас.

tell application "System Events"
    tell application process "Terminal"
        set frontmost to true
        key code {2, 0, 17, 14}
        keystroke return
    end tell
end tell

В приведенном выше примере будут отправлены символы {d a t e} к терминалу, а затем, нажатие клавиши ввода войдет и запустится команда. Используйте приведенный выше пример с любыми ключевыми кодами, которые вам нужны и вы сможете делать то, что вы пытаетесь сделать.

Ответ 12

В последнем примере вы получите ошибки в 10.6.8 (Build 10K549), вызванные ключевым словом "pause".

Замена его словом "wait" заставляет его работать:

tell application "Terminal"
    activate
    my execCmd("ssh [email protected]", 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

Ответ 13

как насчет этого:

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

Ответ 14

Как аккуратное решение, попробуйте

$ open -a /Applications/Utilities/Terminal.app  *.py

или

$ open -b com.apple.terminal *.py

Для запущенной оболочки вы можете перейти в "Настройки" > "Шелл" > установить ее для выхода, если нет ошибки.

Что это.

Ответ 15

Я построил этот script. Это в Yosemite, и bash script использует AppleScript для выбора списка пользователей для SSH-серверов. В основном вы определяете IP-адрес, а затем имена пользователей.. когда приложение запускает его, спрашивает, с кем вы хотите войти в систему, поскольку.. SSH-терминал запускается и регистрируется при запросе пароля...

(***
 * --- --- --- --- ---
 * 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

Я очень рекомендую; Натан Пикманс выше о Shuttle (http://fitztrev.github.io/shuttle/).. очень умный и простое приложение.