【问题标题】:Write ActiveState Tcl Program for Windows that expects a password and enters it为需要密码并输入密码的 Windows 编写 ActiveState Tcl 程序
【发布时间】:2026-01-16 10:00:02
【问题描述】:

我想在 Windows 中编写一个 shell 程序,它运行另一个 shell 脚本,并期望来自 Git bash 终端的密码提示并输入它。 这是我目前所拥有的:

#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
package require Expect

spawn sampleScript.sh
expect "Password:"
send "pass123"

sampleScript.sh 代码:

echo 'Hello, world.' >foo.txt

我的程序输出以下内容:

'The operation completed successfully. while executing "spawn sampleScript.sh" 
(file "compare.tcl" line 6)'

但是,在脚本所在的本地文件夹中没有创建 foo.txt。你能帮忙吗?

【问题讨论】:

  • 您的问题究竟是什么?现在,这是一个“很酷的故事,兄弟”,因为我看不出有什么可以真正回答的。什么不工作?当它不起作用时,你会看到什么?你期待/希望看到什么?
  • 我还没有运行它,因为我没有下载包。我希望能更清楚地了解 Windows 中的基本 tcl 程序是什么样的。我只是希望自动提示密码,这样就不用每次都手动在终端里自动输入了
  • 更现代的 shebang 行是 #!/usr/bin/env tclsh -- 可以替换您的前 3 行。

标签: windows tcl expect


【解决方案1】:

expect 程序的关键是让生成的程序优雅地退出。按照目前的情况,在您的期望脚本发送密码后,它会立即退出,这会过早杀死生成的程序。

  • 如果您不需要与 sampleScript 交互(即让它运行到完成),期望脚本中的最后一行应该是

    expect eof
    
  • 否则,使用

    interact
    

阅读How to create a Minimal, Reproducible Example -- 您更新的代码不会重现您看到的错误

  • Tcl 代码:
    1. 发送东西时,通常需要“回车”:send "password\r"
    2. 您是否将expect eof 添加到Tcl 脚本中?如果没有,您可能会在 sampleScript.sh 有机会创建输出文件之前杀死它
  • sampleScript.sh:这真的是你的示例脚本吗?密码提示在哪里?

【讨论】:

  • 嗨@glenn,我的程序输出以下内容:'操作成功完成。在执行“spawn sampleShell.sh”(文件“compare.tcl”第 6 行)时 sampleScript.sh 代码:echo 'Hello, world.' >foo.txt 但是,在脚本所在的本地文件夹中没有创建 foo.txt。你能帮忙吗?
  • 在 cmets 中很难格式化代码。请将该信息以及您更新的期望脚本放在问题中。
最近更新 更多