[英]how to edit a file in powershell remoting session (powershell)
我正在使用 powershell 远程处理连接到另一台计算机,非常好。 可以做很多事,但我如何编辑文件?
PS C:\\Users\\guutlee> Enter-PSSession -ComputerName appprod
[appprod]: PS C:\\Users\\guutlee\\Documents> cd \\myapp
[appprod]: PS C:\\myapp>
我该怎么做才能在远程机器上的文件上打开文件编辑器?
[appprod]: PS C:\\myapp> 编辑 app.config
所以编辑“文件名”似乎挂起,来自 powershell.exe 或来自 powershell_ise.exe
我唯一能想到的就是退出 pssession 并“启动 \\webprod\\c$\\inetpub\\myapp\\web.config”,这将打开 Visual Studio。
[appprod]: PS C:\\myapp> 退出
PS C:\\Users\\guutlee> start \\agobuild\\c$\\myapp\\app.config
PS C:\\Users\\guutlee> Enter-PSSession -ComputerName appprod
[appprod]: PS C:\\Users\\guutlee\\Documents> cd \\myapp
[appprod]: PS C:\\myapp> myapp.exe
当然,我必须重新找到文件,希望 c$ 共享可用且可访问,并在我想继续时重新连接我的 pssession 并重新找到我的工作目录。 看起来不是很优雅。
我也许可以把它包装成一个函数,但是很难把我的头围绕在它上面..
那么如何使用远程 pssession 方便地编辑文件呢?
编辑
kbrimington 的帖子让我想到了 ssh 的 -X 选项。 对于powershell会话来说,能够将窗口应用程序转发回原始窗口环境可能是一件很棒的事情......
但我仍然很乐意编辑文件。
编辑
使用 vi、emacs、cmd 和编辑进行测试
PS C:\\Users\\Meredith> Enter-PSSession -ComputerName appprod
[appprod]: PS C:\\Users\\guutlee\\Documents> C:\\vim\\vim72\\vim 文件名.txt
[appprod]: PS C:\\Users\\guutlee\\Documents> C:\\emacs-23.2\\bin\\emacs.exe -nw filename.txt
emacs.exe : emacs: 标准输入不是 tty
+ CategoryInfo \\: NotSpecified: (emacs: standard input is not a tty:String) [], RemoteException + FullyQualifiedErrorId \\: NativeCommandError
[appprod]: PS C:\\Users\\guutlee\\Documents> cmd
Microsoft Windows [版本 6.1.7600]
版权所有 (c) 2009 Microsoft Corporation。 版权所有。
C:\\Users\\guutlee\\Documents>
[appprod]: PS C:\\Users\\guutlee\\Documents>编辑文件名.txt
vi 和编辑挂起(Control-C 以获得提示)
cmd 运行,产生一个提示,但立即退出回到 powershell 提示
emacs 产生错误(标准输入不是 tty)
编辑
Jered 建议将文件拉回本地进行编辑。 我用 pssessions 而不是 UNC 修饰了他对复制的回答(也许这就是他的意图)
PS C:\\Users\\Meredith> Invoke-Command -Session $ps -ScriptBlock {get-content c:/inetpub/myapp/web.config} > web.config
编辑网络配置
PS C:\\Users\\Meredith> get-content web.config | Invoke-Command -Session $ps -ScriptBlock {set-content c:/inetpub/myapp/web.config}
潜在地,我们可以在任一方向运行调用命令,本地到远程或远程返回本地。
如果您使用的是 Powershell 5,您可以使用名为 PSEdit 的命令。 它仅适用于 ISE。
远程文件将在(本地)ISE 窗口的新选项卡中打开。
实际上,我从这个 SO 问题的评论部分找到了这个答案,但我认为如果我将它作为答案发布在这里,它会对其他人有所帮助。
你不能在本地拉文件,编辑它并发布它吗? 我知道这很乏味而且不优雅,但似乎编辑目前在远程会话方面存在问题。
例如,
Get-Content REMOTE\Filename.txt > LOCAL\Filename.txt
在本地进行更改,然后
Set-Content -path REMOTE\Filename.txt -value (get-content LOCAL\Filename.txt)
编辑
此外,如果您只替换某些实例,您可以很容易地做到这一点。
例如,
Get-Content REMOTE\Filename.txt | foreach-object { $_ -replace "OLD", "NEW" } | Set-Content REMOTE\Filename.txt
经过大量挖掘,我在 powershell 帮助文档中发现了一些似乎相关的内容。 在 powershell 提示符下,键入:
帮助 about_remote_troubleshooting
在显示的帮助文件的最后,有一个标题为“故障排除无响应行为”的部分,其中指出:
对无响应行为进行故障排除
本节讨论阻止命令完成以及阻止或延迟返回 Windows PowerShell 提示符的远程处理问题。
如何中断命令
某些本机 Windows 程序(例如具有用户界面的程序、提示输入的控制台应用程序以及使用 Win32 控制台 API 的控制台应用程序)在 Windows PowerShell 远程主机中无法正常工作。
使用这些程序时,您可能会看到意外行为,例如无输出、部分输出或未完成的远程命令。 要结束无响应的程序,请键入 CTRL + C。要查看可能已报告的任何错误,请在本地主机和远程会话中键入“$error”。
因此,不幸的是,即使是非 GUI 控制台应用程序(例如 VIM)似乎也无法运行。 任何人都想了解为什么会出现这种情况和/或是否可以解决? 如果我可以在 powershell 远程处理上使用 vim,我会非常喜欢它。
PowerShell_ISE.exe \\REMOTE\...\File.txt
将直接加载和编辑文件,然后一步将其保存回远程计算机,并且由于它的命令行,使用它可以轻松构建函数。 没有解决共享问题,而是我找到的最简单的方法。
首先,在本地机器上创建一个临时文件夹(LOCALTEMPFOLDER)。 然后,使用以下函数:
function vimrem {param([parameter(position=0,mandatory=$true)][string]$Session, [parameter(position=1,mandatory=$true)][string]$Path)
$TempFile = split-path -path $Path -leaf
copy-item -fromsession $Session -path $Path -destination LOCALTEMPFOLDER\$TempFile
vim $LOCALTEMPFOLDER\$TempFile
copy-item -tosession $Session -path LOCALTEMPFOLDER\$TempFile -destination $Path
remove-item -path LOCALTEMPFOLDER\$TempFile
}
这应该可以工作,但在使用此功能之前,您必须离开交互式会话。
使用基于控制台的编辑器(例如 VI 或 Emacs)尝试一下。 在我的评论中,我认为问题在于编辑命令绑定到窗口应用程序,而该窗口应用程序又没有跨远程会话进行虚拟化。
我尝试了上述所有建议,甚至其他与微软相关的解决方案,但没有一个能像你和我想要的那样工作——“完全交互式和响应式外壳”——。 如果您真的想从一开始就拥有 ssh 体验,我建议您安装 ssh 服务器。 我个人使用 freesshd,你可以在这里找到它http://www.freesshd.com以及如何在这里配置它的说明http://www.windowsnetworking.com/articles_tutorials/install-SSH-Server-Windows-Server-2008 .html 在完成说明中的所有内容后,您只需要使用任何 ssh 客户端应用程序连接到您的计算机并使用 powershell 完全交互式。 Vim、edit、emacs 或任何你用来编辑文件的东西都可以正常工作。
我鼓励您不要在 psremoting、telnet、winrs、psexec 上浪费时间,试图实现真正的交互式 shell 提供的功能(我已经失去了它,T_T)。 试试那个 ssh 服务器看看你自己。
受到@chenz 提供的答案的启发,这也可以在 Powershell Integrated Shell 中使用 Visual Studio Code 来完成。 我在 SSH 远程处理上使用 Powershell 7 尝试过这个,但也应该与 WinRM 远程处理一起使用。
Enter-Session ...
[RemoteSystem] PS> psedit service.log
文件名将遵循以下模式:
C:\\users\\dev\\appdata\\local\\temp\\2\\pses-15960\\remotefiles\\1702137071\\winboxname\\service.log
我让 nano 可以通过 SSH 轻松工作到 PowerShell。 它在 Chocolatey 中可用,所以你可以做...
choco install nano -y
那你就可以做...
nano filename
考虑到 PSRemoting 的局限性以及可能的变通方法或解决方案,我一直在深入研究这个问题。
控制台编辑器不起作用,因为它们是本机 (exe) 命令并且基于字符。 (我想知道 cmd over ssh 是否适用于这些)它需要是一个 cmdlet 才能通过 psremote 会话与控制台主机正确交互。
PSRemote 会话是基于行的。 您在本地编辑该行按回车键,然后将其发送到远程端,执行命令并返回结果。 所以它确实支持线路交互,但不支持字符交互。
鉴于所有这些限制,GNU 的 ed 似乎是一个完美的选择。 我很惊讶没有人考虑将它实现为 cmdlet。
我决定进一步调查这个问题,我检查了 powershell cmdlet read-host
工作,然后 C# 等效PSHostUserInterface.ReadLine()
在 PSRemote 会话上工作,他们这样做了,这就是制作工作行编辑器所需的全部内容。
所以这就是我到目前为止所做的。 我可能会在更奇特的正则表达式代码上使用一些帮助。
https://github.com/silicontrip/ps-ed
我用它通过 psremote 会话编辑文件。 (我不会用它来编辑大型源文件,但对于奇怪的小配置文件或 ps1 脚本来说,它是完美的。)
在使用此 cmdlet 之前,请确保您熟悉 GNU ED。 否则就像第一次尝试使用 VI。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.