如何在 bash 中使用 expect

如何在 bash 中使用 expect

我创建了一个如下所示的 shell 脚本。该脚本将以普通用户身份登录到远程服务器,然后切换到 root 用户来创建目录。脚本如下所示。

ssh-t命令[电子邮件保护]'
su root -c "
echo \"给出目录名称:\";
read dir;
mkdir \$dir;
";
'

这里脚本首先会询问普通用户的密码,然后再次询问 root 密码。如何使用expect命令自动执行此操作?我只想自动为 root 用户提供密码。我想可以用以下方法完成expect

請一定幫助我。

答案1

几年后我还没有看到一个被接受的答案,所以我还会添加一些可能对其他人有帮助的内容。我的情况与 SSH 无关,但使用 spawn expect 按照以下方式我能够让它工作。

expect -c "  
  spawn myProc
  expect \"Do you wish to continue with XYZ? (y/N)\" {
    send \"n\r\"
    exp_continue
  }          
"

希望这可以帮助。

答案2

比使用 expect 更好/更简单的方法是 SSHPASS,它通过 SSH 请求发送密码:

sshpass -p <PASSWORD> ssh <USER>@<SERVER> <SSH Command>

PASSWORD 是提示时要输入的密码,USER 是用户名,SERVER 是服务器 IP 地址(例如 10.8.100.100),SSH Command 是您要执行的命令。

例如:

sshpass -p <PASSWORD> ssh [email protected] mkdir <full path for new dir>

要安装 SSHPASS:

sudo apt-get install sshpass

如果你希望 SSH 会话在之后继续,那么你可以使用以下期望,

#!/bin/bash
##Enter Username and Password Details:
userName=<UserName>
password=<Password>

expect -c "
    spawn ssh ${userName}@10.8.100.100 ##put your own IP here
    expect "password: " ##or whatever password prompt you get
    send "$password\r"
    expect -re "Last Login: " ##or whatever the end of your welcome message is
    send "su -i"
    expect "password for <UserName>"
    send "$password\r"
"

这将使 root 访问权限保持登录状态,但是,在脚本发送返回语句之前,它将保持控制权,直到您按下Ctrl+ c。但这应该可以回答你的问题。

答案3

如果你只想传递 root 密码,你必须

  • 配置无密码登录用户帐户,例如使用公钥认证和客户端的 ssh 代理,
  • 或配置服务器(即允许以 root 身份登录,然后执行ssh -t [email protected]

相关内容