Como abrir e trabalhar com terminais usando o script bash?

2

Eu preciso abrir quatro terminais e cada um deles se conectará a quatro computadores remotos diferentes e abrirá locais de diretório específicos nesses computadores. Cada terminal será aberto em diferentes locais na tela da área de trabalho do meu PC. Eu estou usando o Ubuntu-12.04.

    
por MiNdFrEaK 12.06.2013 / 02:49

1 resposta

2

Uma maneira geralmente preferida seria usar tmux , screen ou algo semelhante. Se isto não é uma opção - você quer múltiplas janelas de terminal, etc., você poderia fazer isso de uma maneira mais complexa.

Isso parece feio e pode ser resolvido melhor, mas como ponto de partida. Isso é baseado no bash usando wmctrl para posicionar as janelas do terminal.

1. Posicionar janelas do terminal.

Eu uso um rápido mash-up (script feio) para redimensionar e posicionar janelas de terminal usando wmctrl . Eu tenho isso em uma função chamada c , que leva um ou opcionalmente dois argumentos. Isso pode ser hackeado para atender às suas necessidades.

c()
{
    local -i tbar_height=23  # To take title bar into account.
    local win r="-ir"
    local -i w h w2 h2 y2

    # Argument 2 is Window ID, x or none.
    if [[ "$2" =~ ^0x[0-9a-f]+$ ]]; then
        win="$2"
    elif [[ "$2" == "x" ]]; then
        win="$(xprop -root \
            -f _NET_ACTIVE_WINDOW \
            0x "\t\
#!/bin/bash

# Source positioning script.
. "$HOME/scripts/bash/_mypos_wmctrl"

# Position window according to argument 1.
c "$1"

# Act according to argument 2.
case "$2" in
"host1") ssh -t user@host1 "cd www; bash";;
"host2") ssh -t user@host2 "cd mail; bash";;
"host3") ssh -t user@host3 "cd dev; bash";;
"host4") ssh -t user@host4;;
esac

# Add this if one want to keep terminal window open after exit from ssh
/bin/bash
" _NET_ACTIVE_WINDOW | \ cut -f2)" else win=":ACTIVE:" r="-r" fi # Get monitor size (fear this easily can bug – should be done better). read -d ', ' w h <<< \ $( awk 'NR == 1 { print $8, $10; exit }' <(xrandr) ) ((w2 = w / 2)) # Monitor width / 2 ((h2 = h / 2 - tbar_height)) # Monitor height / 2 - title bar ((y2 = h / 2)) # Monitor height / 2 - title bar case "$1" in # g, x, y, w, h "nw") wmctrl $r "$win" -e "0, 0, 0, $w2, $h2";; "ne") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h2";; "se") wmctrl $r "$win" -e "0, $w2, $y2, $w2, $h2";; "sw") wmctrl $r "$win" -e "0, 0, $y2, $w2, $h2";; "n") wmctrl $r "$win" -e "0, 0, 0, $w, $h2";; "e") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h";; "s") wmctrl $r "$win" -e "0, 0, $y2, $w, $h2";; "w") wmctrl $r "$win" -e "0, 0, 0, $w2, $h";; "mh") wmctrl $r "$win" -e "0, -1, -1, -1, $h";; "mw") wmctrl $r "$win" -e "0, -1, -1, $w, -1";; esac }

Para posicionar a janela noroeste, diga c nw , norte-leste c ne etc. Argumentos mh e mw são altura máxima e largura máxima, respectivamente. O ID da janela pode ser passado como argumento dois ou "x" para o script ler a partir de xprop - else use :ACTIVE: .

2. Script para inicializar bash session em novas janelas de terminal, solicitar posicionamento e iniciar ssh (ou qualquer outro).

Aqui pode-se sintonizar para receber o host como argumento, etc.

#!/bin/bash

terminal=some-terminal-emulator

$terminal -e '/path/to/script2 "nw" "host1"'
sleep 1
$terminal -e '/path/to/script2 "ne" "host2"'
sleep 1
$terminal -e '/path/to/script2 "se" "host3"'
sleep 1
$terminal -e '/path/to/script2 "sw" "host4"'
sleep 1

3. script do iniciador.

O repouso é necessário para que wmctrl obtenha o ID da janela e aja de acordo com ele. Você pode querer olhar para xtoolwait ou similar.

c()
{
    local -i tbar_height=23  # To take title bar into account.
    local win r="-ir"
    local -i w h w2 h2 y2

    # Argument 2 is Window ID, x or none.
    if [[ "$2" =~ ^0x[0-9a-f]+$ ]]; then
        win="$2"
    elif [[ "$2" == "x" ]]; then
        win="$(xprop -root \
            -f _NET_ACTIVE_WINDOW \
            0x "\t\
#!/bin/bash

# Source positioning script.
. "$HOME/scripts/bash/_mypos_wmctrl"

# Position window according to argument 1.
c "$1"

# Act according to argument 2.
case "$2" in
"host1") ssh -t user@host1 "cd www; bash";;
"host2") ssh -t user@host2 "cd mail; bash";;
"host3") ssh -t user@host3 "cd dev; bash";;
"host4") ssh -t user@host4;;
esac

# Add this if one want to keep terminal window open after exit from ssh
/bin/bash
" _NET_ACTIVE_WINDOW | \ cut -f2)" else win=":ACTIVE:" r="-r" fi # Get monitor size (fear this easily can bug – should be done better). read -d ', ' w h <<< \ $( awk 'NR == 1 { print $8, $10; exit }' <(xrandr) ) ((w2 = w / 2)) # Monitor width / 2 ((h2 = h / 2 - tbar_height)) # Monitor height / 2 - title bar ((y2 = h / 2)) # Monitor height / 2 - title bar case "$1" in # g, x, y, w, h "nw") wmctrl $r "$win" -e "0, 0, 0, $w2, $h2";; "ne") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h2";; "se") wmctrl $r "$win" -e "0, $w2, $y2, $w2, $h2";; "sw") wmctrl $r "$win" -e "0, 0, $y2, $w2, $h2";; "n") wmctrl $r "$win" -e "0, 0, 0, $w, $h2";; "e") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h";; "s") wmctrl $r "$win" -e "0, 0, $y2, $w, $h2";; "w") wmctrl $r "$win" -e "0, 0, 0, $w2, $h";; "mh") wmctrl $r "$win" -e "0, -1, -1, -1, $h";; "mw") wmctrl $r "$win" -e "0, -1, -1, $w, -1";; esac }

Teve um script uma vez, perdido e esquecido, que também salvou o ID da janela no arquivo tmp, que poderia ser chamado para mover todos os terminais para outra área de trabalho, aumentar o foco, embaralhar, etc.

Usando wmctrl , ele deve ser utilizável com a maioria dos emuladores (e outros aplicativos, se necessário).

Como agora é ---^ , (as amostras de script são fornecidas), é bastante feio, mas talvez você possa usar algumas delas como base.

    
por 12.06.2013 / 07:22