2010-08-08 6 views
30

Mi sto connettendo a un altro computer utilizzando il servizio remoto di PowerShell, davvero bello. può fare molto, ma come posso modificare un file?come modificare un file nella sessione remota di PowerShell (PowerShell)

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

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

[ appprod]: PS C: \ myapp>

Cosa posso fare per aprire un editor di file su un file sul computer remoto?

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

modo modifica "nomefile" sembra solo per appendere, da powershell.exe o da powershell_ise.exe

Il l'unica cosa che posso pensare è uscire dalla pssession e "avviare \ webprod \ c $ \ inetpub \ myapp \ web.config", che aprirà lo studio visivo.

[appprod]: PS C: \ myapp> exit

PS C: \ Users \ guutlee>inizio \ agobuild \ c $ \ myapp \ app.config

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

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

[appprod]: PS C: \ myapp>myapp.exe

Naturalmente con questo devo ri-trovare il file, spero che il c $ condivisione è disponibile e accessibile, e la riconnessione la mia pssession e ri-trovare la mia directory di lavoro quando voglio andare avanti. Non sembra molto elegante.

potrei forse avvolgere questa è una funzione, ma avendo un momento difficile avvolgere la mia testa intorno che ..

così come faccio comodamente modificare un file con un pssession a distanza?

EDIT

post di kbrimington mi ha fatto pensare l'opzione -X a ssh. probabilmente sarebbe una cosa fantastica per le sessioni di PowerShell essere in grado di inoltrare le applicazioni con finestre all'ambiente di finestre originale ...

ma comunque sarei felice di modificare il file.

EDIT

test utilizzando VI, emacs, cmd e modificare

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

[appprod]: PS C : \ Users \ guutlee \ Documents>C: \ vim \ vim72 \ vim nomefile.txt

[appprod]: PS C: \ Users \ guutlee \ Documents >C: \ emacs-23.2 \ bin \ emacs.exe -nw filename.txt

emacs.exe: emacs: standard input non è una tty

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

+ FullyQualifiedErrorId \: NativeCommandError 

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

Microsoft Windows [versione 6.1.7600]

Copyright (c) 2009 Microsoft Corporation. Tutti i diritti riservati.

C: \ Users \ guutlee \ Documents>

[appprod]: PS C: \ Users \ Documents guutlee>Modifica filename.txt \

vi e modificare appendere (Control- C per ottenere una rapida indietro)

piste cmd, producendo una richiesta, ma esce immediatamente indietro alla richiesta powershell

emacs produce l'errore (standard input non è un TTY)

EDIT

Jered suggerisce di tirare il file indietro a livello locale per modificare. Ho abbellito la sua risposta a copiare utilizzando sessioni PSSession piuttosto che UNC (forse questo è ciò che intendeva)

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

Modifica web config

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

Potenzialmente abbiamo potuto eseguire i comandi Invoke-in entrambe le direzioni, locali a distanza o remoto torna a Locale.

+0

Questo non risponde come modificare comodamente un file, ma è una spiegazione del comportamento sospeso, quindi posterò come commento. La sessione sembra bloccarsi perché una sessione remota non virtualizza le applicazioni con finestre per te; cioè, la tua sessione di modifica sarebbe visibile a te in Desktop remoto se fossi connesso tramite servizi terminal. – kbrimington

+0

non funzionerà molto bene con le app della console interattiva. – x0n

risposta

1

Provalo utilizzando un editor basato su console come VI o Emacs. Come nel mio commento, penso che il problema è che il comando di modifica è associato a un'applicazione con finestra che, a sua volta, non è virtualizzata attraverso una sessione remota.

+0

Credo che edit.com sia l'editor di console e non un'applicazione con finestra . Ho installato emacs, (beh, avevo già installato emacs, cercando di allontanarmi dalle mie radici UNIX con powershell :)). questa è l'uscita > [appprod]: PS C: \ emacs-23.2> \ bin \ emacs.exe -nw \ README.W32 > emacs.exe:.. emacs: standard input non è una tty > + CategoryInfo: NotSpecified: (emacs: input standard non è un tty: String) [ >], RemoteException > + FullyQualifiedErrorId: NativeCommandError – guutlee

+0

Bummer. VI ti porta da qualche parte? Posso eseguire 'cmd' da una sessione remota, quindi forse ero troppo ottimista sul fatto che le altre app console avrebbero funzionato allo stesso modo. – kbrimington

+0

Ho eseguito cmd da una sessione remota, è stato eseguito, ma sono immediatamente uscito da PowerShell. È questo diverso comportamento che stai vedendo? Ho provato vi, è sospeso proprio come ha fatto la modifica. il mio test è riassunto sopra. – guutlee

3

Non è possibile estrarre il file localmente, modificarlo e pubblicarlo? So che questo è noioso e non elegante, ma sembra che gli editori stiano attualmente avendo problemi con le sessioni remote.

esempio

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

Apportare le modifiche a livello locale e poi

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

EDIT

anche se si sta sostituendo solo alcuni casi si può fare questo abbastanza facilmente.

esempio

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

Una buona alternativa alla mia idea iniziale di aprire un editor locale su una condivisione remota. Ma inverte la dipendenza utilizzando la copia in una condivisione locale e poi di nuovo l'editor locale e una copia nella posizione originale. Mi piacerebbe davvero perdere la dipendenza da una condivisione di file in modo da poter esporre solo winrm e nessun servizio aggiuntivo. – guutlee

+0

Che tipo di editing stai facendo? Segue uno schema? –

+0

Principalmente ad-hoc, immagino; magari aggiungendo un paragrafo di testo in un file html; magari aggiornando una stringa di connessione in un'app Web; forse cambiando uno script PowerShell per aggiungere alcune funzionalità. – guutlee

0

cerco tutto il suggerimento di cui sopra e anche altre soluzioni correlate Microsoft ma nessuno funziona il modo in cui si e voglio - "full shell interattiva e reattivo" -. Se vuoi davvero avere l'esperienza ssh che gli utenti unix hanno dall'inizio del tempo ti consiglio di installare un server ssh. Io personalmente uso freesshd, puoi trovarlo qui http://www.freesshd.com e le istruzioni su come configurarlo qui http://www.windowsnetworking.com/articles_tutorials/install-SSH-Server-Windows-Server-2008.html. Dopo aver eseguito tutte le istruzioni contenute nelle istruzioni, è necessario utilizzare qualsiasi app client ssh per connettersi al computer e utilizzare PowerShell completamente interattivo. Vim, edit, emacs o qualsiasi altra cosa tu usi per modificare un file funzionerà senza alcun problema.

ti incoraggio a non sprecare il tuo tempo con psremoting, telnet, winrs, psexec, cercando di ottenere ciò che fornisce una vera shell interattiva (l'ho già perso, T_T). Prova questo server ssh a vedere per te stesso.

+0

Le sessioni Powershell sono progettate per essere apolidi, non sono mai state pensate per essere "complete" shell interattiva e reattiva '. Ci sono vantaggi per * nix shell e PowerShell, e questo sembra essere uno degli svantaggi. Detto questo, ci sono stati alcuni buoni suggerimenti su come aggirarlo. –

3

Dopo aver scavato molto, ho trovato qualcosa che sembra rilevante nella documentazione della PowerShell. Al prompt di PowerShell, digitare:

aiuto about_Remote_Troubleshooting

Alla fine del file di aiuto che viene visualizzato, c'è una sezione intitolata 'Risoluzione dei problemi COMPORTAMENTO INATTIVI', in cui si afferma:

GUASTI BEHAVIOUR RISPONDE

questa sezione vengono illustrati problemi di comunicazione remota che impediscono un comando da completamento e prevenzione o ritardo della restituzione del prompt di Windows PowerShell .

COME interrompere un comando


Alcuni programmi di Windows nativi, come i programmi con interfaccia utente, applicazioni console che richiede per l'input, e la console applicazioni che utilizzano la console API Win32, non lo fanno lavoro correttamente nell'host remoto di Windows PowerShell.

Quando si utilizzano questi programmi, è possibile che si verifichi un comportamento imprevisto, ad esempio come output, output parziale o comando remoto non completo . Per terminare un programma che non risponde, digita CTRL + C.Per visualizzare eventuali errori che potrebbero essere stati segnalati, digitare "$ error" nell'host locale e nella sessione remota.

Così sembrerebbe che anche le applicazioni di console non GUI come VIM non funzioneranno sfortunatamente. Chiunque si preoccupi di fare un po 'di luce sul perché questo potrebbe essere il caso e/o se può essere lavorato in giro? Lo adorerei VERAMENTE se potessi usare vim su remotazione di PowerShell.

+2

Posso far luce sul perché: Console IO su Windows è più vicino a eseguire ioctl su un dispositivo (segnalazione fuori banda) piuttosto che allo streaming dei codici di controllo. Dai un'occhiata a come l'API è strutturata all'indirizzo http://msdn.microsoft.com/en-us/library/windows/desktop/ms682088%28v=vs.85%29.aspx. Confrontalo con le cose come, per esempio, con l'emulazione VT100 (sequenze di escape incorporate in banda). PowerShell funziona su base streaming per I/O e non su console. – user314104

1
PowerShell_ISE.exe \\REMOTE\File.txt 

sarà caricare e modificare il file direttamente e salvarlo di nuovo al computer remoto in un unico passaggio e, dal momento che la sua linea di comando, facile da costruire funzioni di usarlo. Non va in giro a condividere problemi, ma il modo più semplice che ho trovato.

14

Se si utilizza Powershell 5, è possibile utilizzare il comando denominato PSEdit. Funziona solo da ISE.

  1. Quindi, prima, aperta PowerShell ISE
  2. Quindi aprire sessione remota al computer remoto utilizzando Enter-PSSession
  3. Poi modificare il file utilizzando PsEdit 'filename'

Il file remoto sarà aperto in una nuova scheda nella finestra ISE (locale).

In realtà ho trovato questa risposta dalla sezione commenti di this SO question, ma penso che sarà utile per gli altri se la posto come risposta qui.

-1

Ho ottenuto nano per lavorare facilmente su SSH a PowerShell. E 'disponibile in Chocolatey così si può solo fare ...

choco install nano -y 

Poi si può solo fare ...

nano filename 
0

In primo luogo, creare una cartella temporanea sulla macchina locale (LOCALTEMPFOLDER). Quindi, utilizzare la seguente funzione:

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 

} 

Questo dovrebbe funzionare, ma si dovrà lasciare una sessione interattiva prima di utilizzare questa funzione.

+1

Non è necessario fornire domande di esempio prima della risposta. Solo la risposta e qualsiasi spiegazione di accompagnamento. – AfroThundr