2014-10-28 2 views
1

Я использую псевдоним Bash, который позволяет мне сократить команду SSH, чтобы я мог войти в мои маршрутизаторы. Довольно тривиальная, но экономия времени! Теперь я хотел бы сделать это еще дальше и полностью автоматизировать регистрацию маршрутизаторов.Expect in Alias ​​

Например, в моем ~/.bashrc файле У меня есть следующая запись:

sshFuncB() 
{ 
    ssh -o StrictHostKeyChecking=no [email protected]$1 - | /usr/bin/expect<<EOF 
    set timeout 5 
    set send_human {.1 .3 1 .05 2} 

    expect { 
     "password: " { send -h "MYPASSWORD\r" } 
     "No route to host" { exit 1 } 
     timeout { exit 1 } 
    } 
    set timeout 2 
    sleep 1 
    expect { 
     "N]?" { send "y\r"; exp_continue } 
     timeout { exit 1 } 
    } 
    expect eof 
EOF 
} 

alias z=sshFunc 

Однако, когда я типа z myrouterhostname это не дает желаемых результатов. Я должен найти способ запустить SSH-соединение и ожидать автоматического входа в систему, прежде чем возвращать управление пользователю.

Любые идеи?

+0

Ваш псевдоним 'z' указывает на' sshFunc' не 'sshFuncB'. Надеюсь, это опечатка. Один вопрос. Вы получаете какой-то результат? – Dinesh

ответ

1

Это можно сделать следующим образом,

sshFuncB() 
{ 
    expect -c " 
    spawn ssh -o StrictHostKeyChecking=no [email protected]$1 
    set timeout 5 
    set send_human {.1 .3 1 .05 2} 

    expect { 
     \"password: \" { send -h \"MYPASSWORD\r\" } 
     \"No route to host\" { exit 1 } 
     timeout { exit 1 } 
    } 
    set timeout 2 
    sleep 1 
    expect { 
     \"N]?\" { send \"y\r\"; exp_continue } 
     timeout { exit 1 } 
    } 
    expect eof 
    " 
} 

alias z=sshFuncB 

Обратите внимание на использование флага в -cexpect, которые вы можете обратиться с here из вас есть какие-либо сомнения.

Если мы используем двойные кавычки для кода expect с флагом -c, это позволит замену bash. Если вы используете одиночные кавычки для них, то замены bash не будут работать. (Вы использовали @1 внутри ожиданий, поэтому я использовал двойные кавычки). Поскольку я использовал двойные кавычки для всего кода ожиданий, нам нужно избегать каждой двойной котировки с обратной косой чертой внутри оператора ожидания, как показано ниже:

expect { 
     # Escaping the double quote with backslash 
     \"password: \" {some_action_here} 
    } 

Еще одно обновление. Так как речь идет о подключении к маршрутизатору и выполнении некоторых ваших ручных операций, тогда лучше иметь interact в конце.