Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wyświetleniem wyniku skryptu. shell_exec Powershell
Forum PHP.pl > Forum > PHP
stumpy
Witam, tworze interfejs do skryptów w powershell i mam problem.
Oto kawałek kodu w której może być problem i w którym nie działa mi wykonywanie skryptu.

CODE
<form action="Powerinterface.php" method="GET">
Nowa nazwa serwera: <input type=textfield name=nowanazwa>
</form>
<?php
$nazwa = $_GET['nowanazwa'];
if (isset($_POST['Exe3']))
{
shell_exec('powershell.exe -command C:\skrypty\zmiananazwy.ps1 -computer localhost -newname '.$nazwa);
}
?>
<form action="PowerInterface.php" method="post">
<input type="hidden" name="Exe3" value="true">
<input type="submit" value="Zmień nazwę serwera">
</form>


Natomiast gdy zamiast wprowadzania poprostu w miejsce $nazwa wpisze to co bym wpisał w formularzu.

CODE
<form action="Powerinterface.php" method="GET">
Nowa nazwa serwera: <input type=textfield name=nowanazwa>
</form>
<?php
$nazwa = $_GET['nowanazwa'];
if (isset($_POST['Exe3']))
{
shell_exec('powershell.exe -command C:\skrypty\zmiananazwy.ps1 -computer localhost -newname serwer');
}
?>
<form action="PowerInterface.php" method="post">
<input type="hidden" name="Exe3" value="true">
<input type="submit" value="Zmień nazwę serwera">
</form>


Wszystko działa jak powinno.

Czy ktoś mi może pomóc co jest źle z tą zmienną? jak może inaczej pobrać tekst i dać ją w miejscu $nazwa?


Pozdrawiam

Dziękuje za pomoc
wizu
  1. <input type=textfield name=nowanazwa>


Nie ma czegoś takiego jak type="textfield"

Zamień to na:

  1. <input type="text" name="nowanazwa" />


Dodatkowo, ten pierwszy formularz nie jest nigdzie wysyłany.
Po kliknięciu w przycisk Zmień nazwę serwera zostanie wysłany tylko
  1. <input type="hidden" name="Exe3" value="true">


Musisz dorzucić <input type="submit" value="wyslij" /> do pierwszego formularza i wysyłać poprzez kliknięcie w ten przycisk.

Może wtedy otrzymasz poprawnie dane w $_GET
stumpy
Dzieki Wizu, nadal nie działa ale na pewno dzięki tobie jestem bliżej rozwiązania problemu.

Tak to teraz wygląda:

CODE
<h3 Align=left> <b>Skrypt zmienia nazwe serwera:</b> </h3>
<form action="Powerinterface.php" method="GET">
Nowa nazwa serwera: <input type="text" name="nowanazwa" />
<input type="submit" value="Potwierdz"/>
</form>
<?php
$nazwa = $_GET['nowanazwa'];
if (isset($_POST['Exe3']))
{
shell_exec('powershell.exe -command C:\skrypty\zmiananazwy.ps1 -computer localhost -newName '.$nazwa);
}
?>
<form action="PowerInterface.php" method="post">
<input type="hidden" name="Exe3" value="true">
<input type="submit" value="Zmien nazwe serwera">
</form>
wizu
Przez cały czas nie rozumiem, po co Ci dwa form-y?
Zauważ, że jeśli wyślesz pierwszy form
  1. <h3 Align=left> <b>Skrypt zmienia nazwe serwera:</b> </h3>
  2. <form action="Powerinterface.php" method="GET">
  3. Nowa nazwa serwera: <input type="text" name="nowanazwa" />
  4. <input type=submit value=Potwierdz>
  5. </form>

To if zwróci false i nie zadziała, bo
  1. if (isset($_POST['Exe3']))

Przecież nie wysłałeś nigdzie $_POST['Exe3']
Jest on wysyłany w drugim formie
  1. <form action="PowerInterface.php" method="post">
  2. <input type="hidden" name="Exe3" value="true">
  3. <input type="submit" value="Zmien nazwe serwera">
  4. </form>

Jednak jeśli wyślesz ten drugi, to nie masz nigdzie $_GET['nowanazwa'], więc też nie zadziała.
Musisz to wszystko połączyć, tzn:
Kod
<h3 Align=left> <b>Skrypt zmienia nazwe serwera:</b> </h3>
<form action="PowerInterface.php" method="post">
<input type="hidden" name="Exe3" value="true">
Nowa nazwa serwera: <input type="text" name="nowanazwa" />
<input type="submit" value="Zmien nazwe serwera">
</form>
<?php
$nazwa = $_POST['nowanazwa'];
if (isset($_POST['Exe3']))
{
shell_exec('powershell.exe -command C:\skrypty\zmiananazwy.ps1 -computer localhost -newName '.$nazwa);
}
?>
stumpy
Teraz działa smile.gif dzięki wizu! od wczoraj uczę się php i jeszcze wszystkiego nie ogarniam.

Wspaniałe forum, dzisiaj się zarejestrowałem i już wiem ze warto było. Wiem ze zawsze ktoś może pomóc z problemem.

Wracam do pracy nad rozbudowaniem dalej tego interfejsu.

Jeszcze raz dzięki wizu za pomoc.


Czy mogę coś takiego zrobić?
  1. <?php
  2. $serw = $_POST['serwer'];
  3. $log = $_POST['login'];
  4. $pass = $_POST['password'];
  5. if ($serw="localhost"){
  6. if (isset($_POST['Execute']))
  7. {
  8. shell_exec('powershell.exe -command C:\skrypty\reset.ps1 -computer '.$serw);
  9. }
  10. }
  11. Else{
  12. if (isset($_POST['Execute']))
  13. {
  14. shell_exec('powershell.exe -command C:\skrypty\reset.ps1 -computer '.$serw.'-user '.$log.'-password '.$pass);
  15. }
  16. }
  17. ?>


Edit: O jeden ; za dużo smile.gif już wszystko działa.
cojack
Nie zapomnij o http://www.php.net/manual/en/function.escapeshellcmd.php
stumpy
Witam, nie będę zakładał nowego wątku ale mam problem żeby wyświetlić wynik skryptu.
Mam skrypt proc.ps1 którego kod to "get-process"

CODE
<h3 Align=left> <b>Procesy:</b> </h3>
<form action="procesy.php" method="post">
<input type="hidden" name="Execute" value="true">
<p><input type="submit" value="Wyświetl procesy:">
</form>
<?php
if (isset($_POST['Execute']))
{
$output = shell_exec('powershell.exe -command C:\skrypty\proc.ps1');
var_dump($output);
}
?>


Wie może ktoś jak przekazać wynik wykonanego skryptu żeby formatowanie zostało w miarę zachowane?

Edit: Kod lekko poprawiony, działa lecz dziwnie sformatowane i nie czytelne.
kiler129
Nie ma czegoś takiego jak "printf = $output". Zmień tą linijkę na np. var_dump($output) albo echo "<pre>$output</pre>";
stumpy
Tak to teraz wygląda:
CODE
<h3 Align=left> <b>Procesy:</b> </h3>
<form action="procesy.php" method="post">
<input type="hidden" name="Execute" value="true">
<p><input type="submit" value="Wyświetl procesy:">
</form>
<?php
if (isset($_POST['Execute']))
{
$output = system('powershell.exe -command C:\skrypty\proc.ps1');
var_dump($output);
}
?>


Wyświetla:
string(3443) " Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 34 6 1872 3284 27 0,05 744 cmd 33 5 796 2476 25 0,02 772 conhost 29 4 836 2508 44 0,02 1908 conhost 460 11 1832 3956 47 0,67 316 csrss 195 15 9956 5712 58 1,39 368 csrss 66 7 1656 4848 53 0,09 1836 dwm 581 36 19128 37280 194 5,11 1860 explorer 0 0 0 24 0 0 Idle 327 29 5368 16548 127 0,84 876 iexplore 364 29 5172 18496 136 0,59 1232 iexplore 568 19 3456 9736 43 1,38 480 lsass 144 7 2112 3880 22 0,08 488 lsm 142 17 3100 7248 60 0,23 1000 msdtc 129 16 12856 18860 108 2,63 1672 notepad++ 257 24 34512 33740 177 1,36 1612 powershell 203 13 4004 7564 36 1,70 472 services 29 2 368 1032 5 0,20 216 smss 305 23 7360 14116 108 3,94 244 spoolsv 282 32 7116 11768 51 0,56 300 svchost 346 14 3368 8652 54 1,81 576 svchost 235 15 2824 6580 34 0,38 648 svchost 294 15 8644 11340 47 0,97 732 svchost 914 38 15740 30300 131 3,56 780 svchost 218 17 4676 9072 43 0,48 832 svchost 189 14 3292 9284 62 0,20 880 svchost 406 32 12688 15200 89 1,44 920 svchost 100 11 4552 9428 56 0,30 1028 svchost 46 4 780 2600 13 0,03 1060 svchost 158 14 7304 11364 59 0,36 1224 svchost 67 7 1368 4376 29 0,14 1696 svchost 455 0 112 304 3 4 System 135 11 2624 5984 58 0,13 1772 taskhost 120 11 2220 7308 73 1,58 1900 TPAutoConnect 130 11 2296 6536 57 0,14 1680 TPAutoConnSvc 222 17 5316 10616 95 3,66 1088 vmtoolsd 88 9 2708 6584 41 0,13 1300 VMUpgradeHelper 72 9 2128 5820 71 0,08 1076 VMwareTray 199 14 3848 12472 112 1,27 1052 VMwareUser 165 39 9492 14936 68 0,48 828 w3wp 77 9 1344 4264 47 0,30 376 wininit 92 7 1456 4712 31 0,27 412 winlogon "

Trzeba poprawić to formatowanie , coś jest nie tak i własnie nie wiem co sad.gif
Noidea
  1. <?php
  2.  
  3. $output = shell_exec( "powershell.exe -command get-process" );
  4.  
  5. $outputLines = explode( "\n", $output ); // Dzielimy wyjście na linie
  6. $outputLines = array_filter( $outputLines ); // Usuwamy puste linie (pusty string rzutowany na bool daje: FALSE)
  7. $outputLines = array_slice( $outputLines, 2 ); // Usuwamy dwie pierwsze linie (nagłówek)
  8.  
  9. $processes = array();
  10. foreach( $outputLines as $line )
  11. {
  12. // Każda kolumna `get-process` zawiera stałą, określoną liczbę znaków
  13. if( preg_match( "~(?<Handles>.{7})(?<NPM>.{8})(?<PM>.{9})(?<WS>.{11})(?<VM>.{6})(?<CPU>.{9})(?<Id>.{7})(?<ProcessName>.+)~", $line, $matches ) )
  14. {
  15. $matchesAssocKeys = array_filter( array_keys( $matches ), "is_string" ); // Wyciągamy z tablicy $matches klucze, które są typu string (Handles, NPM, PM, ...)
  16. $matches = array_intersect_key( $matches, array_flip( $matchesAssocKeys ) ); // Używamy kluczy z poprzedniej linii do odfiltrowania tablicy (zostają w niej tylko wartości mający klucz typu string)
  17.  
  18. $matches = array_map( "trim", $matches ); // Każdą wartość przepuszczamy przez funkcję trim (usuwa białe znaki)
  19.  
  20. $processes[] = $matches;
  21. }
  22. }
  23.  
  24. print_r( $processes );
  25.  
  26. ?>


W skrócie: dzielisz ten długi string na linijki, wywalasz śmieci, a potem z każdej linijki wyciągasz interesujące cię liczby. Kod niezbyt czytelny, ale możesz na podstawie komentarzy przerobić go na swoją modłę.

Natomiast jeśli chodzi ci o samo wyświetlenie tych danych w przeglądarce, to wstaw sobie je do tagu <pre></pre>
stumpy
hmmm, myślałem ze to łatwiej będzie sad.gif i do tego myślałem ze będę miał sposób na każdy skrypt który wyciąga informacje.

Planowałem ze będę zmieniał sobie tylko nazwę skryptu w tej linijce:
  1. $output = system('powershell.exe -command C:\skrypty\proc.ps1');


i do tego dorobię sobie obsługę argumentów na przykład C:\skrypty\proc.ps1 -computer localhost abym mógł wybierac takze zdalne komputery.

Dzięki za pomoc.

Witam już działa, kod wygląda tak:
CODE
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang"pl">
<head>
<meta http-equiv=Content-type" content=text/html; charset=utf-8" />
<title> PowerInterface - interfejs do wykonywania skryptow w jezyku Powershell</title>
</head>
<body>
<h3 Align=left> <b>Procesy:</b> </h3>
<form action="procesy.php" method="post">
<input type="hidden" name="Execute" value="true">
<p><input type="submit" value="Wyświetl procesy:">
</form>
<?php
if (isset($_POST['Execute']))
{
$output = shell_exec('powershell.exe -command C:\skrypty\proc.ps1');
echo "<pre>$output</pre>";
}
?>
</body>
<p><a href="http://localhost:/index.php">Powrót na stronę główną</a>
</html>



Zmieniłem treść skryptu dodając: | out-string


i jakoś działa smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.