web-dev-qa-db-fra.com

comment modifier un fichier dans une session à distance powershell (powershell)

Je me connecte à un autre ordinateur à l'aide de la télécommande à distance, vraiment sympa. peut faire beaucoup, mais comment éditer un fichier?

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

[appprod]: PS C:\Users\guutlee\Documents> cd\myapp

[appprod]: PS C:\myapp>

que puis-je faire pour ouvrir un éditeur de fichiers sur un fichier sur la machine distante?

[appprod]: PS C:\myapp> modifier app.config

donc modifier "nom de fichier" semble juste se bloquer, à partir de powershell.exe ou de powershell_ise.exe

La seule chose à laquelle je peux penser est de sortir de la session et de "démarrer\webprod\c $\inetpub\myapp\web.config", ce qui ouvrirait Visual Studio.

[appprod]: PS C:\myapp> exit

PS C:\Users\guutlee> démarrer\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

Bien sûr, je dois retrouver le fichier, espérer que le partage c $ est disponible et accessible, puis reconnecter ma session et retrouver mon répertoire de travail quand je veux continuer. Cela ne semble pas très élégant.

Je pourrais peut-être envelopper c'est une fonction, mais avoir du mal à envelopper ma tête autour de cela ..

alors, comment puis-je facilement modifier un fichier avec une session à distance?

ÉDITER

le message de kbrimington m'a fait penser à l'option -X de ssh. ce serait probablement génial pour les sessions PowerShell de pouvoir retransmettre des applications fenêtrées à l'environnement de fenêtrage d'origine ...

mais je serais quand même content de modifier le fichier.

ÉDITER

tests utilisant vi, emacs, cmd et 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: l'entrée standard n'est pas un tty

+ CategoryInfo          \: NotSpecified: (emacs: standard input is not a tty:String) [], RemoteException

+ FullyQualifiedErrorId \: NativeCommandError

[appprod]: PS C:\Users\guutlee\Documents> cmd

Microsoft Windows [version 6.1.7600]

Copyright (c) 2009 Microsoft Corporation. Tous les droits sont réservés.

C:\Users\guutlee\Documents>

[appprod]: PS C:\Users\guutlee\Documents> modifier le nom de fichier.txt

vi et éditer le blocage (Control-C pour récupérer une invite)

cmd s'exécute, produisant une invite, mais revient immédiatement à l'invite PowerShell

emacs produit l'erreur (l'entrée standard n'est pas un tty)

ÉDITER

Jered suggère de retirer le fichier localement pour le modifier. J'ai embelli sa réponse à la copie en utilisant des sessions plutôt que des UNC (c'est peut-être ce qu'il voulait)

PS C:\Users\Meredith> Invoke-Command -Session $ ps -ScriptBlock {get-content c: /inetpub/myapp/web.config}> web.config

modifier la configuration Web

PS C:\Users\Meredith> get-content web.config | Invoke-Command -Session $ ps -ScriptBlock {set-content c: /inetpub/myapp/web.config}

Nous pourrions potentiellement exécuter les commandes invoke dans les deux sens, local vers distant ou distant vers local.

33
guutlee

Si vous utilisez Powershell 5, vous pouvez utiliser la commande appelée PSEdit. Cela ne fonctionne que depuis ISE.

  1. Alors d'abord, ouvrez PowerShell ISE
  2. Ouvrez ensuite la session à distance sur l'ordinateur distant à l'aide d'Enter-PSSession
  3. Modifiez ensuite le fichier en utilisant PsEdit 'filename'

Le fichier distant sera ouvert dans un nouvel onglet dans votre fenêtre ISE (locale).

En fait, j'ai trouvé cette réponse dans la section des commentaires de cette SO question , mais je pense que cela sera utile pour les autres si je la poste comme réponse ici.

21
chenz

Vous ne pouvez pas extraire le fichier localement, le modifier et le publier? Je sais que c'est fastidieux et pas élégant, mais il semble que les éditeurs rencontrent actuellement des problèmes avec les sessions à distance.

Par exemple.,

Get-Content REMOTE\Filename.txt > LOCAL\Filename.txt

Apportez vos modifications localement, puis

Set-Content -path REMOTE\Filename.txt -value (get-content LOCAL\Filename.txt)

ÉDITER

De plus, si vous ne remplacez que certaines instances, vous pouvez le faire assez facilement.

Par exemple.,

Get-Content REMOTE\Filename.txt | foreach-object { $_ -replace "OLD", "NEW" } | Set-Content REMOTE\Filename.txt
4
Jered Odegard

Après avoir beaucoup fouillé, j'ai trouvé quelque chose qui semble pertinent dans la documentation d'aide de powershell. À l'invite PowerShell, tapez:

aide about_remote_troubleshooting

À la toute fin du fichier d'aide qui s'affiche, il y a une section intitulée "DÉPANNAGE DES COMPORTEMENTS NON RESPONSABLES", qui indique:

DÉPANNAGE DES COMPORTEMENTS NON RESPONSABLES

Cette section traite des problèmes d'accès distant qui empêchent l'exécution d'une commande et empêchent ou retardent le retour de l'invite Windows PowerShell.

COMMENT INTERROMPRE UNE COMMANDE


Certains programmes Windows natifs, tels que les programmes avec une interface utilisateur, les applications de console qui demandent une entrée et les applications de console qui utilisent l'API de console Win32, ne fonctionnent pas correctement dans l'hôte distant Windows PowerShell.

Lorsque vous utilisez ces programmes, vous pouvez voir un comportement inattendu, comme aucune sortie, une sortie partielle ou une commande à distance qui ne se termine pas. Pour mettre fin à un programme qui ne répond pas, tapez CTRL + C. Pour afficher les erreurs qui auraient pu être signalées, tapez "$ error" dans l'hôte local et la session distante.

Ainsi, il semblerait que même les applications de console non GUI telles que VIM ne fonctionnera malheureusement pas. Quiconque souhaite éclairer un peu pourquoi cela pourrait être le cas et/ou s'il peut être travaillé J'adorerais VRAIMENT si je pouvais utiliser vim sur la télécommande à distance.

4
dtm

Créez d'abord un dossier temporaire sur la machine locale (LOCALTEMPFOLDER). Utilisez ensuite la fonction suivante:

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

}

Cela devrait fonctionner, mais vous devrez quitter une session interactive avant d'utiliser cette fonction.

3
Henrique
PowerShell_ISE.exe \\REMOTE\...\File.txt 

chargera et éditera directement le fichier et l'enregistrera sur l'ordinateur distant en une seule étape et, depuis sa ligne de commande, il sera facile de créer des fonctions en l'utilisant. Ne contourne pas les problèmes de partage, mais le moyen le plus simple que j'ai trouvé.

3
Lor

J'essaie toutes les suggestions ci-dessus et même d'autres solutions liées à Microsoft, mais aucune ne fonctionne comme vous et moi - "Shell interactif et réactif" -. Si vous voulez vraiment avoir l'expérience ssh que les utilisateurs d'Unix ont depuis le début, je vous recommande d'installer un serveur ssh. J'utilise personnellement freesshd, vous pouvez le trouver ici http://www.freesshd.com et des instructions pour le configurer ici http://www.windowsnetworking.com/articles_tutorials/ install-SSH-Server-Windows-Server-2008.html . Après avoir fait tout ce qui est indiqué dans les instructions, il vous suffit d'utiliser n'importe quelle application cliente ssh pour vous connecter à votre ordinateur et utiliser powershell full interactive. Vim, edit, emacs ou tout ce que vous utilisez pour éditer un fichier fonctionnera sans aucun problème.

je vous encourage à ne pas perdre votre temps avec psremoting, telnet, winrs, psexec, en essayant de réaliser ce qu'un véritable shell interactif fournit (je l'ai déjà perdu, T_T). Essayez ce serveur ssh et voyez par vous-même.

1
mjsr

Essayez-le à l'aide d'un éditeur basé sur une console tel que VI ou Emacs. Comme dans mon commentaire, je pense que le problème est que la commande d'édition est liée à une application fenêtrée qui, à son tour, n'est pas virtualisée sur une session distante.

1
kbrimington

J'ai obtenu que nano fonctionne facilement via SSH vers PowerShell. Il est disponible en Chocolatey donc vous pouvez simplement faire ...

choco install nano -y

Ensuite, vous pouvez simplement faire ...

nano filename
0