我创建了一个如下所示的 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] …