繁体   English   中英

如何在powershell远程会话(powershell)中编辑文件

[英]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。

  1. 首先,打开PowerShell ISE
  2. 然后使用 Enter-PSSession 打开到远程计算机的远程会话
  3. 然后使用 PsEdit 'filename' 编辑文件

远程文件将在(本地)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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM