gpt4 book ai didi

linux - 在 Perl 中使用 expect 和 system()

转载 作者:太空狗 更新时间:2023-10-29 11:45:25 25 4
gpt4 key购买 nike

我正在尝试使用 expect 在 Perl 脚本中使用系统调用来递归地在远程服务器上创建目录。相关调用如下:

system("expect -c 'spawn  ssh  $username\@$ip; expect '*?assword:*' {send \"$password\r\"}; expect '*?*' {send \"mkdir -p ~/$remote_start_folder/$remote_folder_name/$remote_username/$remote_date/\r\"}; expect '*?*' {send \"exit\r\"};  interact;'");

这很好用。然而,如果这是第一次使用 ssh 访问远程机器,它会要求一个 (yes/no) 确认。我不知道在上面的声明中在哪里添加它。有没有办法将它合并到上面的语句中(使用某种 -ing)?

最佳答案

yes/no 匹配添加到与密码匹配相同的 expect 调用中:

expect '*yes/no*' {send "yes\r"; exp_continue;} '*?assword:*' {send \"$password\r\"};

这将查找两个匹配项,如果遇到 yes/no exp_continue 告诉 expect 继续查找密码提示。

完整示例:

system( qq{expect -c 'spawn  ssh  $username\@$ip; expect '*yes/no*' {send "yes\r"; exp_continue;} '*?assword:*' {send "$password\r"}; expect '*?*' {send "mkdir -p ~/$remote_start_folder/$remote_folder_name/$remote_username/$remote_date/\r"}; expect '*?*' {send "exit\r"};  interact;'} );

我也用过 qq以避免必须转义所有报价。从带有 -d 标志的 shell 运行此命令显示期望查找任一匹配项:

Password: 
expect: does "...\r\n\r\nPassword: " (spawn_id exp4) match glob pattern
"*yes/no*"? no
"*?assword:*"? yes

使用 yes/no 提示:

expect: does "...continue connecting (yes/no)? " (spawn_id exp4) match glob pattern
"*yes/no*"? yes
...
send: sending "yes\r" to { exp4 }
expect: continuing expect
...
expect: does "...\r\nPassword: " (spawn_id exp4) match glob pattern
"*yes/no*"? no
"*?assword:*"? yes
...
send: sending "password\r" to { exp4 }

关于linux - 在 Perl 中使用 expect 和 system(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19220396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com