将参数传递给本地存储的bash脚本,该脚本需要使用PythonParamiko在远程机器上执行



我在本地机器上存储了一个shell脚本。脚本需要以下参数:

#!/bin/bash
echo $1
echo $2

我需要在远程机器上运行此脚本(而不复制远程机器上的脚本(。我使用Python的Paramiko模块来运行脚本,并且可以在远程服务器上调用而不会出现任何问题。

问题是我无法将这两个参数传递给远程服务器。以下是我在远程服务器上执行本地脚本的python代码片段:

with open("test.sh", "r") as f:
mymodule = f.read()
c = paramiko.SSHClient()
k = paramiko.RSAKey.from_private_key(private_key_str)
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect( hostname = "hostname", username = "user", pkey = k )
stdin, stdout, stderr = c.exec_command("/bin/bash - <<EOFn{s}nEOF".format(s=mymodule))

使用bash,我可以简单地使用以下命令:

ssh -i key user@IP bash -s < test.sh "$var1" "$var2"

有人能帮助我如何使用Python将这两个参数传递到远程服务器吗?

做同样的事情,在bash:中做什么

command = "/bin/bash -s {v1} {v2}".format(v1=var1, v2=var2)
stdin, stdout, stderr = c.exec_command(command)
stdin.write(mymodule)
stdin.close()

如果您喜欢heredoc语法,如果您希望参数展开,则需要使用单引号:

command = "/bin/bash -s {v1} {v2} <<'EOF'n{s}nEOF".format(v1=var1,v2=var1,s=mymodule)
stdin, stdout, stderr = c.exec_command(command)

与在bash中使用引号的方式相同:

ssh -i key user@IP bash -s "$var1" "$var2" <<'EOF'
echo $1
echo $2
EOF

尽管您的Python代码中有一个变量中的脚本,为什么不直接修改脚本本身呢?这会更直接,imo.


强制性警告:不要使用AutoAddPolicy–这样做会失去对MITM攻击的保护。有关正确的解决方案,请参阅Paramiko"未知服务器">

最新更新