是否可以在 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