Как редактировать файл в сеансе удаленного взаимодействия powershell (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 и "start \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 заставил меня задуматься о опции -X для ssh. вероятно, для сеансов PowerShell было бы здорово перенаправить оконные приложения обратно в исходную оконную среду...

но все же я был бы рад просто отредактировать файл.

РЕДАКТИРОВАТЬ

тестирует с использованием vi, emacs, cmd и edit

PS C: \ Users \ Meredith> Enter-PSSession -ComputerName appprod

[appprod]: PS C: \ Users \ guutlee \ Documents> C: \ vim \ vim72 \ vim filename.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. Все права защищены.

C: \ Users \ guutlee \ Documents>

[appprod]: PS C: \ Users \ guutlee \ Documents> редактировать filename.txt

vi и отредактируйте зависание (Control-C, чтобы получить подсказку обратно)

cmd запускается, выдает приглашение, но сразу же возвращается к приглашению powershell

Emacs выдает ошибку (стандартный ввод не tty)

РЕДАКТИРОВАТЬ

Джерид предлагает вытащить файл обратно для локального редактирования. Я украсил его ответ на копирование, используя 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}

Потенциально мы могли бы запускать команды invoke в любом направлении, локальное или удаленное или локальное.

10 ответов

Если вы используете Powershell 5, вы можете использовать команду PSEdit. Работает только от ISE.

  1. Итак, во-первых, откройте PowerShell ISE
  2. Затем откройте удаленный сеанс на удаленном компьютере, используя Enter-PSSession
  3. Затем отредактируйте файл, используя PsEdit 'filename'

Удаленный файл будет открыт в новой вкладке в вашем (локальном) окне ISE.

На самом деле я нашел этот ответ в разделе комментариев этого SO вопроса, но я думаю, что это будет полезно для других, если я опубликую его как ответ здесь.

После долгих размышлений я нашел кое-что уместное в справочной документации PowerShell. В командной строке powershell введите:

справка about_remote_trou устранение неполадок

В самом конце файла справки, который отображается, есть раздел, озаглавленный "УСТРАНЕНИЕ НЕИСПРАВНОСТЕЙ ПОВЕДЕНИЯ", в котором говорится:

УСТРАНЕНИЕ НЕИСПРАВНОСТЕЙ БЕЗ ОТВЕТСТВЕННОГО ПОВЕДЕНИЯ

В этом разделе рассматриваются проблемы удаленного взаимодействия, которые препятствуют выполнению команды, а также предотвращают или задерживают возврат приглашения Windows PowerShell.

КАК ПРЕРЫВАТЬ КОМАНДУ


Некоторые собственные программы Windows, такие как программы с пользовательским интерфейсом, консольные приложения, запрашивающие ввод данных, и консольные приложения, использующие консольный API-интерфейс Win32, не работают правильно на удаленном хосте Windows PowerShell.

При использовании этих программ вы можете столкнуться с непредвиденным поведением, таким как отсутствие вывода, частичный вывод или удаленная команда, которая не завершается. Чтобы завершить не отвечающую программу, введите CTRL + C. Чтобы просмотреть все ошибки, о которых можно было сообщить, введите "$error" на локальном хосте и в удаленном сеансе.

Таким образом, может показаться, что даже консольные приложения без GUI, такие как VIM, не будут работать, к сожалению. Кто-нибудь хочет пролить немного света на то, почему это может иметь место и / или можно ли обойти это? Я ДЕЙСТВИТЕЛЬНО любил бы это, если бы я мог использовать vim вместо удаленного взаимодействия PowerShell.

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

}

Это должно работать, но вам придется покинуть интерактивный сеанс, прежде чем использовать эту функцию.

Вы не можете вытащить файл локально, отредактировать его и опубликовать? Я знаю, что это утомительно и не элегантно, но кажется, что редакторы в настоящее время имеют проблемы с удаленными сеансами.

Например,

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

Вдохновленный ответом @chenz, это также можно сделать с помощью кода Visual Studio, находясь внутри интегрированной оболочки Powershell. Я пробовал это с Powershell 7 через удаленное взаимодействие SSH, но он также должен работать с удаленным взаимодействием WinRM.

Enter-Session ...
[RemoteSystem] PS> psedit service.log

Имя файла будет следовать этому шаблону:

C: \ users \ dev \ appdata \ local \ temp \ 2 \ pses-15960 \ remotefiles \ 1702137071 \ winboxname \ service.log

Я пробую все вышеупомянутое предложение и даже другое решение, связанное с Microsoft, но ни одно из них не работает так, как вы и я - "полностью интерактивная и отзывчивая оболочка" -. Если вы действительно хотите иметь опыт работы с ssh, который есть у пользователей unix с самого начала, я рекомендую вам установить 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, пытаясь добиться того, что обеспечивает настоящая интерактивная оболочка (я уже потерял ее, T_T). Попробуйте этот ssh-сервер и убедитесь сами.

Попробуйте это с помощью консольного редактора, такого как VI или Emacs. Как и в моем комментарии, я думаю, что проблема в том, что команда edit связана с оконным приложением, которое, в свою очередь, не виртуализируется в удаленном сеансе.

Я изучал это довольно тщательно, учитывая ограничения PSRemoting и возможные обходные пути или решения.

Консольные редакторы не работают, поскольку они являются собственными (exe) командами и основаны на символах. (Мне интересно, работает ли с ними cmd over ssh) Это должен быть командлет для правильного взаимодействия с хостом консоли в сеансе psremote.

Сеанс PSRemote является линейным. Вы редактируете строку локально, нажимаете Enter, а затем она отправляется на удаленный конец, команда выполняется и возвращается результат. Таким образом, он поддерживает интерактивность строк, но не интерактивность персонажей.

Учитывая все эти ограничения, редакция GNU кажется идеальной. Я удивлен, что никто не рассматривал возможность его реализации в виде командлета.

Я решил разобраться в этом подробнее, я проверил, что командлет powershell read-host работает, а затем эквивалент С # PSHostUserInterface.ReadLine() работают над сеансом PSRemote, и они это делают, и это все, что нужно для создания рабочего редактора строк.

Итак, вот что я сделал до сих пор. Я, вероятно, мог бы использовать некоторую помощь по более экзотическому коду регулярных выражений.

https://github.com/silicontrip/ps-ed

Я использовал это для редактирования файлов через сеанс psremote. (Я бы не стал редактировать с его помощью большие исходные файлы, но для небольшого странного конфигурационного файла или сценария ps1 он идеален.)

Перед использованием этого командлета убедитесь, что вы знакомы с GNU ED. В противном случае это было бы похоже на попытку использовать VI в первый раз.

Я получил Nano легко работать над SSH в PowerShell. Это доступно в Шоколад, так что вы можете просто сделать...

choco install nano -y

Тогда вы можете просто сделать...

nano filename
Другие вопросы по тегам