使用 PowerShell 调用服务器以运行 python 脚本:无法打开文件 [Errno 13] 权限被拒绝
Posted
技术标签:
【中文标题】使用 PowerShell 调用服务器以运行 python 脚本:无法打开文件 [Errno 13] 权限被拒绝【英文标题】:Invoke server with PowerShell to run python script: can't open file [Errno 13] Permission denied 【发布时间】:2021-11-25 23:03:45 【问题描述】:我知道这是权限问题,但我不知道在哪里。
基本上,我有一个 PowerShell 脚本,它从本地用户那里获取一些信息,然后通过 python 将其发送到 API。由于某种原因,我发布到的 API 无法正确地从 PowerShell 中获取 JSON(认为无论你做什么都是格式错误的),所以我使用 python 来做最后一点。
调用必须来自我们的服务器 ip,所以我必须将信息传递给服务器和 python 文件并调用服务器来调用 API。我这样做:
Invoke-Command -ComputerName $servername -ScriptBlock python.exe "PATH TO .PY" -id $using:CaseID -tag $using:serviceTag -m $using:message
我明白了:
C:\PATH-TO\python.exe: can't open file 'PATH TO .PY': [Errno 13] Permission denied
python 文件位于网络共享上。我已经尝试让“每个人”组读/写文件夹以查看结果,但它仍然是一样的。
我唯一的想法归结为服务器执行时脚本块在哪个用户下运行,以及是否需要提供凭据。
【问题讨论】:
尝试将-Authentication Credssp
添加到 Invoke-Command 调用(您必须启用 CredSSP:docs.microsoft.com/en-us/powershell/module/…)。问题似乎在于您的凭据未传递到网络位置。
这是 Kerberos 双跳问题;您可以对 PS 远程会话的第一台服务器进行身份验证,但是从那里您的远程服务器连接不允许使用您的登录令牌与文件共享所在的下一台服务器通信。 “所有人”权限不包括未经身份验证的用户,我认为您需要 Anonymous Logon account for that 这是一个糟糕的解决方案。多个alternative solutions and workarounds exist。
【参考方案1】:
正如 cmets 所说,这是臭名昭著的 PowerShell 双跳问题。
服务器 A(我)调用 服务器 B 以在“服务器 C”(网络共享)上运行脚本。
我之所以说“服务器 C”是因为网络共享附加到 服务器 B 本身。我在脚本块中使用了直接路径而不是网络共享路径,一切正常。基本上是服务器 A 到 B。
以前,我打算走传递凭据的路线(不是 Credssp 的粉丝),但是当我传递它们时,即使这样也行不通。
最好的文档在这里: https://docs.microsoft.com/en-us/archive/blogs/ashleymcglone/powershell-remoting-kerberos-double-hop-solved-securely
【讨论】:
以上是关于使用 PowerShell 调用服务器以运行 python 脚本:无法打开文件 [Errno 13] 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
python在powershell中运行脚本给出'非utf'错误[重复]
在 C# 中使用不同的凭据调用远程 powershell 脚本
使用 Powershell 中的异步 API 的运行空间问题
批处理如何调用管理员权限的PowerShell命令执行语句?