在 oneliner 中使用 she-bang

在 oneliner 中使用 she-bang

是否可以在 oneliner 中使用 she-bang?

我正在尝试从运行这个脚本https://stackoverflow.com/questions/16928004/how-to-enter-ssh-password-using-bash,在一个班轮中。

如果我将其放入文件中,并使用 ./file 运行它,它会按预期工作,但是我如何才能将其作为 oneliner 运行呢?

这可以作为脚本使用,没有任何问题。

#!/usr/bin/expect -f
spawn ssh [email protected]
expect "assword:"
send "mypassword\r"
interact

我怎样才能从 oneliner 运行它?

如果我尝试跑步

spawn ssh [email protected]; expect "assword:"; send "mypassword\r"; interact

它返回:

bash: spawn: command not found

如果我尝试跑步

#!/usr/bin/expect -f; spawn ssh [email protected]; expect "assword:"; send "mypassword\r"; interact

然后整个事情被视为评论并且什么也没有发生。

编辑:

尝试运行答案中建议的内容:

expect -c `spawn ssh user@server "ls -lh /some/file"; expect "assword:"; send "mypassword\r"; interact`

它回来了

bash: spawn: command not found
couldn't read file "assword:": no such file or directory
bash: send: command not found
bash: interact: command not found
expect: option requires an argument -- c

运行时:

$ cat << 'EOF' | /usr/bin/expect -
> spawn ssh user@server "ls -lh file"
> expect "assword:"
> send "password\r"
> interact
> EOF

它似乎通过 SSH 连接到服务器,但不运行该命令,或者不输出任何结果:

它返回:

spawn ssh user@server ls -lh file
user@server password

当我从脚本运行它时:

./test
spawn ssh user@server ls -lh file
user@server's password:
-rw-rw-r-- 1 user user 467G Jan  2 00:46 /file

编辑2:

第一个命令的问题是使用反引号而不是单引号,以下命令按预期工作

expect -c 'spawn ssh user@server "ls -lh file"; expect "assword:"; send "mypassword\r"; interact'

:

答案1

作为一句话,您可以将脚本作为参数传递给expect -c

expect -c 'spawn ssh [email protected]; expect "assword:"; send "mypassword\r"; interact'

请注意,shell 的引号是'...'and "...",expect 对应的引号是{...}and "...",因此传递 shell 变量等有一定的灵活性。

但这很快就会变得不可读且无法维护。

答案2

expect可以从标准输入读取其脚本:

cat << 'EOF' | /usr/bin/expect -
spawn ssh [email protected]
expect "assword:"
send "mypassword\r"
interact
EOF

相关内容