借助Posh-SSH模块(W10),在远程服务器上运行本地python脚本

时间:2019-08-13 16:23:00

标签: python powershell ssh

我想通过使用Powerhsell中的模块Posh-SSH 在远程服务器上运行本地python脚本。 此topic通过执行以下操作以常规的ssh进行提及:

Get-Content hello.py | ssh user@192.168.1.101 python -

我想在这里使用Posh-SSH模块,但我不知道如何实现...

我尝试过这样的事情,但是它不起作用

Invoke-SSHCommand -Index $sessionid.sessionid -Command "$(Get-Content hello.py) | python3 -u -" -ErrorAction Stop

编辑

没有显示错误,只停留在上面,什么也不做...

EDIT2

好,我现在知道为什么发送多行py文件时出现此错误。

新行未重新转录,请查看将什么命令发送到远程服务器:

python3 -u - <<"--ENDOFPYTHON--"
chevre="basic" print("Hello, World!")
--ENDOFPYTHON--

而不是:

python3 -u - <<"--ENDOFPYTHON--"
chevre="basic" 
print("Hello, World!")
--ENDOFPYTHON--

EDIT3

最后完成! 感谢这个topic,我执行了将空白更改为应换行的操作。 为此而已

( (Get-Content hello.py) -join "`r`n")

而不是简单的

$(Get-Content hello.py)

最后一行是:

$cmd = "python3 -u - <<`"--ENDOFPYTHON--`"`n$((Get-Content $pyscript) -join "`r`n")`n--ENDOFPYTHON--"
Invoke-SSHCommand -Index $sessionid.sessionid -Command $cmd -ErrorAction Stop

也不要忘记删除该行

#!/usr/bin/env python3

如果出现在py文件的顶部,否则它将无法正常工作。

1 个答案:

答案 0 :(得分:0)

您当前正在将以下内容发送到SSH端点:

# Example Python Added: would be replaced with your code
print("Hello, World!") | python3 -u -

假设bash作为端点外壳,则以上内容无效,并且会产生错误或挂起。

您需要使用echo(假设bash ssh端点)封装发送到服务器的代码。

Invoke-SSHCommand -Index $sessionid.sessionid -Command "echo '$((Get-Content hello.py) -join "`r`n")' | python3 -u -" -ErrorAction Stop

以上内容现在将发送:

echo 'print("Hello, World!")' | python3 -u -

这在您不使用单引号的情况下有效。但是,如果必须使用那些或其他特殊字符,则可能需要使用here文档:

Invoke-SSHCommand -Index $sessionid.sessionid -Command "python3 -u - <<`"--ENDOFPYTHON--`"`n$((Get-Content hello.py) -join "`r`n")`n--ENDOFPYTHON--" -ErrorAction Stop

这里的文档将把它的确切信息发送到程序的标准输入流:制表符,空格,引号和所有内容。因此,以上内容将发送以下内容:

python3 -u - <<"--ENDOFPYTHON--"
print("Hello, World!")
--ENDOFPYTHON--

您可以使用--ENDOFPYTHON--替换任何内容,只要它不会出现在python文件中即可。

Reference for here docs

更新:

添加了-join "`r`n",因为如发问者所指出的那样,正确发送换行符是必需的。