2014-12-15 3 views
4

Я ленив, и я предпочитаю, чтобы компьютеры выполняли мою работу за меня. Я SSH на несколько машин на ежедневной основе, поэтому я создал простой скрипт, который запускает некоторые XTERM окна и помещает их в местах, которые я хочу (как вы можете видеть, я использую Баш):Как запустить несколько окон xterm и запустить команду для каждого из них, оставив каждое окно открытым после?

#!/bin/bash 
xterm -geometry 80x27+1930+0 & 
xterm -geometry 80x27+2753+0 & 
xterm -geometry 80x27+1930+626 & 
xterm -geometry 80x27+2753+626 & 

Однако, следующее, что я обращусь к первому окну и типа в

ssh server_a 

затем во втором

ssh server_b 

и так далее. Я хотел бы сделать, чтобы мой скрипт выполнял команды ssh в каждом окне xterm, а затем оставлял окна открытыми для выполнения моей работы. Я видел параметр -e для xterm, но окно закрывается после выполнения моей команды. Есть ли способ сделать это?

Приносим извинения, если это дублирующийся вопрос. Я искал вокруг и не имел никакой удачи с этим. Большое спасибо!

+0

Вы хотите окно, чтобы остаться после того, как вы выходите из сеанс ssh? Или окна выходят немедленно, потому что вы выполняете определенную команду через ssh и хотите, чтобы сеанс ssh оставался открытым (и, следовательно, окно)? –

ответ

4

Я хотел бы видеть более изящный ответ, но то, что я придумал делает работу:

xterm -e bash -c 'echo foo; exec bash' 

Заменить echo foo с командой на ваш выбор, и вы хорошо идти.

+0

Отлично, спасибо! Это делает то, что я хочу! – user3609282

+0

Обратите внимание, что (хотя бы некоторые версии) 'xterm' также имеют опцию' -hold', которая предотвращает увольнение окна сразу после завершения команды, поэтому вы можете просмотреть окончательный вывод, если это то, что было желательно ... – twalberg

2

This answer дает один из лучших ответов, которые я видел до сих пор. Используйте флаг Баш --init-file либо в притон или при выполнении терминал:

#!/bin/bash --init-file 
commands to run 

... и выполнить его как:

xterm -e /path/to/script 
# or 
gnome-terminal -e /path/to/script 
# or 
the-terminal -e bash --init-file /path/to/script/with/no/shebang 

Моя единственная реальная жалоба с опцией exec будет, если команда выполнена до exec bash работает, и пользователь прерывает его (^C), он не запускает оболочку. С опцией -init-file оболочка продолжает работать.

Другой вариант cmdtool из проекта OpenWin:

/usr/openwin/bin/cmdtool -I 'commands; here' 
# or 
/usr/openwin/bin/cmdtool -I 'commands; here' /bin/bash 

... где cmdtool впрыскивает команды, передаваемые с -I в процессе работорговли, как если бы он был набран пользователем. Это приводит к оставлению выполненных команд в истории оболочки.

0

Другой вариант - использовать терминатор гнома. Это создает и позиционирует терминалы в интерактивном режиме, и вы можете настроить каждый терминал для запуска команд в настройках терминатора.

делает также множество дополнительных трюков с помощью сочетания клавиш для таких вещей, как перемещать, вращать, развернуть/свернуть терминалы в пределах содержащего окна терминатора

См: https://superuser.com/a/610048

+0

Не знаете, почему они проголосовали за вас, потому что это правильный ответ для такого рода работ. – vimdude