【问题标题】:perl SSH to router change default promptperl SSH 到路由器更改默认提示
【发布时间】:2014-12-24 15:41:21
【问题描述】:

我支持使用模块(Net::SSH::Expect)通过 SSH 登录路由器。

知道如何更改默认提示,因为当我尝试在代码下方运行时(部分代码) 我没有得到任何输出。

my $session = Net::SSH::Expect->new (
        host => 'bsin810',
        user => "$user",
        password=> "$pass",
        timeout => 10,
        raw_pty => 1
    );


$session->run_ssh();


$session->exec("term len 0");
@op=$session->exec("sh run int lo99");
@op1=$session->exec("sh isis neighbor");

这是我通过服务器登录路由器的方式。

%ssh xxxx@bsin810

密码:

欢迎

现在,当我更改交互式命令的代码时,它工作正常。下面的代码工作正常。

my $session = Net::SSH::Expect->new (
        host => "$node",
        user => "$user",
        timeout => 10,
        raw_pty => 1
    );


$session->run_ssh();


$session->waitfor('password: ');
$session->send("$pass");

【问题讨论】:

    标签: perl ssh


    【解决方案1】:

    run_ssh之后添加这个

    #Test if you received the remote prompt:
    ($ssh->read_all(2) =~ />\s*\z/) or die "where's the remote prompt?"
    

    来自documentation

    如果您不会在服务器上运行提示输入的交互式命令 输入,例如“passwd”,您可以阻止 ssh 服务器 为 ssh 登录过程分配一个 ptty。这是通过启用 'no_terminal' 构造函数属性。这样做是通过 ssh 客户端进程创建时的“-T”选项。来自 BSD ssh 客户端手册:-T 禁用伪 tty 分配。

    这将创建更清晰的连接。你不会有 ptty 在服务器上,奇怪的是,您不会收到远程提示。 试试自己的 'ssh -T my.ssh.server' 看看它是如何工作的。请注意 一些依赖终端的系统命令不起作用,比如“谁是” i'、'stty' 等

    此外,“passwd”或“mail”等交互式命令将无法 打印他们的提示。

    但其他系统命令会运行得更好:将打印“ls -l” 没有终端控制字符。 'ps -ef' 将有命令 行完全打印,因为没有“列”终端限制。

    故事的寓意:伪终端进行许多字符翻译 在某些情况下可能会带来一些意想不到的结果。避免他们 如果可以的话。

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 1970-01-01
      • 2016-08-21
      • 2019-07-21
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多