Как редактировать файл в сеансе удаленного взаимодействия 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.
- Итак, во-первых, откройте PowerShell ISE
- Затем откройте удаленный сеанс на удаленном компьютере, используя Enter-PSSession
- Затем отредактируйте файл, используя 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