bash - 期望别名

标签 bash ssh expect

我正在使用Bash别名,该别名允许我缩短SSH命令以便我登录到路由器。相当琐碎,但可以节省时间!我现在想做的是使这一步骤更进一步,并使路由器的登录完全自动化。

例如,在我的~/.bashrc文件中,我具有以下条目:

sshFuncB()
{
    ssh -o StrictHostKeyChecking=no superuser@$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连接,并期望在将控制权返回给用户之前自动登录。

有任何想法吗?

最佳答案

这可以按如下方式完成:

sshFuncB()
{
    expect -c "
    spawn ssh -o StrictHostKeyChecking=no superuser@$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

请注意,您可以从here中引用-c中的expect标志,您对此有任何疑问。

如果我们对带有expect标志的-c代码使用双引号,则将允许bash替换。如果您使用单引号将其引起来,则bash替换将不起作用。 (您在Expect中使用了@1,这就是为什么我使用双引号的原因)因为我在整个Expect代码中使用了双引号,所以我们必须在Expect语句中使用反斜杠对每个双引号进行转义,如下所示,
   expect {
        # Escaping the double quote with backslash
        \"password: \" {some_action_here}
   }

再更新一次。由于这是关于连接到路由器并执行一些手动操作的,因此最好在末尾添加interact

关于bash - 期望别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26606513/

相关文章:

bash - 替换 bash 变量中的换行符?

git - 向组织内的私有(private)存储库添加了部署 key ,但仍无法克隆存储库

linux - 如何将代码部署到所有位于不同网络上的硬件节点?

passwords - 如何让 Expect 脚本提示输入密码?

linux - 在 Expect 脚本中运行 Rsync 命令

linux - Bash 脚本 : Read text after characters

bash - 使用 Bash 遍历目录和子目录中的所有文件

linux - 如何在 Bash 脚本中使用 Expect 生成预填充的终端 session

linux - Bash:没有这样的文件或目录?

使用 ppk、rsa、pkcs8 进行 PHP 身份验证