【问题标题】:Shell scripting input password from scriptShell脚本从脚本输入密码
【发布时间】:2023-10-18 02:19:01
【问题描述】:

我正在尝试编写一个 shell 脚本来将文件传输到运行 ultra simple sftp server 的远程 Windows 机器。 它是来自 coreftp 的轻量级版本。 所以我没有使用公钥认证的选项。

从 Linux 端看,它是非英特尔平台的精简版,所以如果我想使用“expect”,我无法安装 expect/tcl/tk。 这是出于测试目的,我想从 Shell 脚本输入密码。有方法吗?

#!/bin/sh
HOST='10.x.x.x'
USER='user'
PASSWD='passwd'

sftp $USER@$HOST

不使用任何工具就不能从shellscript输入密码吗?

【问题讨论】:

  • 我假设你也不能为 perl、python 或其他语言安装 expect 模块?
  • 是的,我无法安装其他软件包。
  • expect 将为大多数架构编译。
  • 是交叉编译expect和依赖包TCL/TK比较耗时。
  • “无法安装”如“缺乏根访问权限”或“缺乏主目录”?许多 Perl 和 Python 包都可以轻松安装在您的主目录中。

标签: linux shell ssh sftp


【解决方案1】:

有几种选择:

  1. 您可以使用sshpass 自动进行密码验证。

  2. Putty 包 (psftp) 中的 SFTP 客户端从命令行接受密码(尽管这样做并不完全安全)。

  3. 然后您可以使用一些支持 SFTP 的脚本语言。如果你走那条路,不要只使用一些类似期望的模块来自动化密码认证,而是使用一些自己实现 SFTP 协议的模块,如果你想执行错误检查,这将使你更容易喜欢。

【讨论】:

    【解决方案2】:

    你可以使用期望..

    expect -c 'spawn sftp root@your-domain.com; expect password; send "your-password\n"; interact'
    

    【讨论】:

    • 感谢您的回答。但是当我尝试时,我处于无法使用期望的位置。
    • 不用担心,据我所知,这在 shellscript 中是不可能的。最好的选择是 ssh 密钥/期望
    【解决方案3】:

    This page 包含一个简单的 C 演示程序,用于创建伪终端,可以与需要密码的应用程序(更准确地说,需要终端的应用程序)进行交互,如 ftp、sftp 客户端等。同一页面还提到了lpty,这是另一个更完整的实用程序,您可以使用它在伪终端上运行您的程序。

    简而言之,您需要一个可以处理伪终端的程序来完成您的任务。无论是 expect,perl 和 expect 模块,上面提到的直接 C 编程,还是 lpty,另一个伪终端程序。或者,如果您的 Linux 内核支持 /dev/ptmx 和 /dev/pty/,您可以通过打开和访问设备文件来创建伪终端(可能来自 shell 脚本,但我不确定)。不过,我怀疑您在 ARM 上的简单 Linux 是否支持...

    移植 lpty 应该比预期的要容易。

    【讨论】: