Question Utilisation de Telnet/ping in PowerShell

Plus d'informations
il y a 15 ans 9 mois #7474 par moti
Bonjour,
En fait, j'utlise depuis longtemps un fichier batch pour tester la connectivité IP de mes serveurs/pcs dans mon réseau. le principe du script est lancer une boucle qui va chercher les adresses IP dans un fichier list.txt, le pinger et renseigner le résultat dans un fichier result.txt.
Mais là, je n'ai plus le droit de lancer les ping depuis mon pc et donc je dois passer par un routeur cisco où ce genre de manip est autorisé.
Je me demande si qq1 a une idée comment résoudre ça peut être c'est possible avec PS, car je dois d'abord ouvrir une session telnet à ce routeur et puis faire la même chose que le bat.

Merci pour votre aide.

Cordialement,

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7475 par Richard Lazaro
Bonjour à toi,

Je pense que tu devrais regarder du côté de WinSCP et apprendre à utiliser son \"API\".

winscp.net/eng/docs/lang:fr

Cela permet de se connecter en ssh et d'exécuter des commandes. Cela devrait pouvori t'aider.

Bien Cordialement,
Richard Lazaro.

PS : Il y a un autre sujet qui a utilisé WinSCP => powershell-scripting.com/index.php?optio...id=7468&catid=14

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7476 par Arthur

Je pense que tu devrais regarder du côté de WinSCP et apprendre à utiliser son \"API\".


on peut aussi utiliser plink.exe. Versiona a codé un très bon script :

powershell-scripting.com/index.php?optio...47&catid=14#5247

Car mon script est plus orienté vers le transfert de fichiers. :P<br><br>Message édité par: bilbao, à: 28/07/10 14:53

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7482 par Alan Pinard
Bonjour Moti,

tu peux utiliser, comme le mentionne Bilbao, cette fonction.

[code:1]
Function VA-PlinkSSHCmd {

PARAM(
$Server,
$Username,
$Password,
$CmdFile,
$PlinkPath,
$PlinkCmd,
$pgpfp,
$Verbose,
$Session,
$Protocol,
$Port,
$Interactive,
$ForwardLocalPort,
$ForwardRemotePort,
$X,
$A,
$T,
$ProtocolVersion,
$Compression,
$KeyFile,
$Pageant,
$Tunnel
)

BEGIN{
If ($Server -eq $Null){Throw \&quot;Veillez indiquer un adresse de serveur enutilisant l'option -Server &lt;IP&gt;\&quot;}
ElseIf ($Username -eq $Null){Throw \&quot;Aucun nom d'usager n'a été indiqué, utiliser l'option -Username &lt;Nom_D'usager&gt;\&quot;}
ElseIf ($Password -eq $Null){Throw \&quot;Aucun mot de passe n'a été indiqué, utiliser l'option -Password &lt;MotDePasse&gt;\&quot;}
ElseIf ($PLinkPath -eq $Null){Throw \&quot;Plink.exe est introuvable, utiliser l'option -PlinkPath &lt;Drive:\Folder\plink.exe&gt;\&quot;}
ElseIf (($PlinkCmd -eq $Null) -and ($CmdFile -eq $Null)){Throw \&quot;Aucune command ne sera envoyé à Plink.exe, utiliser l'option -PlinkCmd &lt;ls /tmp&gt; ou l'option -CmdFile &lt;Drive:\Folder\CmdFile.txt&gt;\&quot;}
}

PROCESS {
$PlinkSShOptions = \&quot;\&quot;
$Password = $Password.Insert(0,\&quot;-pw \&quot;«»)

If($Verbose -ne $Null){
If($Verbose -eq \&quot;Disable\&quot;«») {
$Verbose = \&quot;\&quot;
}
ElseIf ($Verbose -eq \&quot;Enable\&quot;«») {
$Verbose = \&quot;-v \&quot;
$PlinkSShCmd.Length
$PlinkSShOptions.Insert(($PlinkSShOptions.Length), $Verbose)
}

Else {
Throw \&quot;L'option -Verbose peut être [Enable | Disable]. Ex: -Verbose Disable\&quot;
}
}
If($X -ne $Null){
If($X -eq \&quot;Disable\&quot;«») {
$X = \&quot;-x \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $X)
}
ElseIf ($X -eq \&quot;Enable\&quot;«») {
$X = \&quot;-X \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShCmd.Length, $X)
}

Else {Throw \&quot;L'option -X peut être [Enable | Disable]. Ex: -X Disable\&quot;}
}
If($A -ne $Null){
If($A -eq \&quot;Disable\&quot;«») {
$A = \&quot;-a \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $A)
}
ElseIf ($A -eq \&quot;Enable\&quot;«») {
$A = \&quot;-A \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $A)
}
Else {Throw \&quot;L'option -A peut être [Enable | Disable]. Ex: -A Disable\&quot;}
}
If($T -ne $Null){
If($T -eq \&quot;Disable\&quot;«») {
$T = \&quot;-t \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $T)
}
ElseIf ($T -eq \&quot;Enable\&quot;«») {
$T = \&quot;-T \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $T)
}
Else {Throw \&quot;L'option -T peut être [Enable | Disable]. Ex: -T Disable\&quot;}
}
If($ProtocolVersion -ne $Null){
If($ProtocolVersion -eq \&quot;2\&quot;«») {
$ProtocolVersion = \&quot;-2 \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $ProtocolVersion)
}
ElseIf ($ProtocolVersion -eq \&quot;1\&quot;«») {
$ProtocolVersion = \&quot;-1 \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $ProtocolVersion)
}
Else {Throw \&quot;L'option -ProtocolVersion peut être [1 | 2]. Ex: -ProtocolVersion 2\&quot;}
}
If($Compression -ne $Null){
If($Compression -eq \&quot;Disable\&quot;«») {
$Compression = $Null
}
ElseIf ($Compression -eq \&quot;Enable\&quot;«») {
$Compression = \&quot;-C \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Compression)
}
Else {Throw \&quot;L'option -Compression peut être [Enable | Disable]. Ex: -Compression Disable\&quot;}
}
If($Pageant -ne $Null){
If($Pageant -eq \&quot;Disable\&quot;«») {
$Pageant = \&quot;-noagent \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Pageant)
}
ElseIf ($Pageant -eq \&quot;Enable\&quot;«») {
$Pageant = \&quot;-agent \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Pageant)
}
Else {Throw \&quot;L'option -Pageant peut être [Enable | Disable]. Ex: -Pageant Disable\&quot;}
}
If($Interactive -ne $Null){
If($Interactive -eq \&quot;Disable\&quot;«») {
$Interactive = $Null
}
ElseIF ($Interactive -eq \&quot;Enable\&quot;«») {
$Interactive = \&quot;-batch \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Interactive)
}
Else {Throw \&quot;L'option -Interactive peut être [Enable | Disable]. Ex: -Interactive Disable\&quot;}
}
If($Port -ne $Null){
If($Port -eq \&quot;22\&quot;«»){$Port = $Null
}
Else {
$Port = \&quot;-P $Port \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Port)
Write-Host -ForegroundColor Yellow \&quot;Port :\&quot;$PlinkSShOptions
}
}

If($Protocol -ne $Null){
If($Protocol -eq \&quot;ssh\&quot;«»){
$Protocol = \&quot;-ssh \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Protocol)
}
ElseIf($Protocol -eq \&quot;telnet\&quot;«»){
$Protocol = \&quot;-telnet \&quot;
}
ElseIf($Protocol -eq \&quot;rlogin\&quot;«»){
$Protocol = \&quot;-rlogon \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Protocol)
}
ElseIf($Protocol -eq \&quot;raw\&quot;«»){
$Protocol = \&quot;-raw \&quot;
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Protocol)
}
Else {
$Protocol = $Null
}
}
Write-Host $PlinkSShOptions
$PlinkSShCmd = $PlinkPath + \&quot; \&quot; + $PlinkSShOptions + \&quot; \&quot; + $Password + \&quot; \&quot; + $Username + \&quot;@\&quot; + $Server + \&quot; \&quot; + $PlinkCmd

Write-Host -ForegroundColor Cyan \&quot;Commande envoyé par PLink.exe -&gt;\&quot;$PlinkSShCmd

$ConMsgCmd_PlinkSShCmd = Invoke-Expression -Command $PlinkSShCmd
}

END {
Return $ConMsgCmd_PlinkSShCmd
}

}
[/code:1]

Voici un exemple d'appel de la fonction:

VA-PlinkSSHCmd -PLinkPath \&quot;D:\Source\PLink\Plink.exe\&quot; -Interactive \&quot;Enable\&quot; -ProtocolVersion \&quot;2\&quot; -Username \&quot;root\&quot; -Password \&quot;toor\&quot; -Server \&quot;Server.mondomaine.local\&quot; -PlinkCmd \&quot;df -h\&quot; -Compression \&quot;Enable\&quot;


Au préalable, il te faudra télécharger PLink.exe du projet Putty.

**Prendre note que si vous voulez utiliser Telnet avec Plink.exe, il semble qu'il y ait un problème avec le passage d'un nom d'usager et d'un mot de passe.

J'ai découvert une fonction sur le net en Powershell Afin de ce connecter en Telnet avec username et password. Par contre, j'ai 3 soucis:

1.Le script ne semble pas vouloir s'arrêter (seulement avec un Ctrl-C). Je crois que cela pourrait être corriger avec un peu d'aide.

2.Il retourne le résultat que dans la console. Je crois aussi que cela pourrait être résolu avec un peu d'aide.

3.Tu dois mettre en clair le mot de passe et le nom d'usager dans un fichier texte. Encore-là, on pourrait p-e s'arranger pour le mettre en SecureString ou quelque chose du genre.

Ceci étant dit, je te post quand même ce que j'ai:

[code:1]
Function VA-Telnet {

Param(
[string] $remoteHost = \&quot;localhost\&quot;,
[int] $port = 23
)

## Open the socket, and connect to the computer on the specified port
$Socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port)

$Result = \&quot;\&quot;

If($Socket -eq $null) { $Result = $False } Else {

$Stream = $Socket.GetStream()
$Writer = new-object System.IO.StreamWriter($stream)
$Buffer = new-object System.Byte[] 1024
$Encoding = new-object System.Text.AsciiEncoding



While($TRUE)
{
## Allow data to buffer for a bit
Start-Sleep -m 1000

## Read all the data available from the stream, writing it to the
## screen when done.
While($Stream.DataAvailable) {

$Read = $Stream.Read($Buffer, 0, 1024)
Write-host -n ($Encoding.GetString($Buffer, 0, $Read))
$Result = ($Result + ($Encoding.GetString($Buffer, 0, $Read)))
}

## Write command from pipeline to the remote host
$Cmd = $Input | out-string
$Writer.WriteLine($Cmd)
$Writer.Flush()
}

## Close the streams
$Writer.Close()
$Stream.Close()
}
Write-Host $Result
Return $Result
}
[/code:1]

Exemple d'utilisation de la fonction:

$Cmd2 = @\&quot;
username
password
ping server1
\&quot;@

$Cmd2 | VA-Telnet 10.10.250.100 23


**Ce n'est pas un code qui provient de moi mais je ne me souviens plus de qui il vient.


Alan Pinard
Version A<br><br>Message édité par: Versiona, à: 28/07/10 20:05

Alan Pinard
Version A

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7483 par Richard Lazaro
Bonjour,

alors pour VA-Telnet :

1.Le script ne semble pas vouloir s'arrêter (seulement avec un Ctrl-C). Je crois que cela pourrait être corriger avec un peu d'aide.


Oui, il tombe dans une boucle While ... et ya pas de repère pour l'arrêter, en tout cas j'en trouve pas.

2.Il retourne le résultat que dans la console. Je crois aussi que cela pourrait être résolu avec un peu d'aide.


Tu remplaces le Write-Host par un Write-Output, et cela pourra être pipe avec autre chose.

3.Tu dois mettre en clair le mot de passe et le nom d'usager dans un fichier texte. Encore-là, on pourrait p-e s'arranger pour le mettre en SecureString ou quelque chose du genre.


Enfait, le login et mot de passe est envoyé comme une entrée clavier sur le telnet (de ce que je comprends). Donc tu aurais un parametre SecureString, mais il faudrait quand même dans le script retrouver la valeur non secureString et l'envoyer.

Voilà de ce que j'ai pu comprendre du script sans pouvoir le tester malheureusement :/

Bien Cordialement,
Richard Lazaro.

Think-MS : (Get-Life).Days | %{ Learn-More }

\\&quot;Problems cannot be solved by the same level of thinking that created them.\\&quot; - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7484 par moti
Bonjour,

Merci pour vos réponses.

En fait, j'ai un ancien routeru cisco (2620) qui ne support pas le ssh à mon avis, donc la fonction VA-PlinkSSHCmd ne vas pas me servir dans ce cas.
J'ai trouvé un script en perl qui est bien fait, mais je n'arrive pas à le faire marcher, j'ai des problèmes avec la fonction net::telnet::cisco.
=============================
use Net::Telnet::Cisco;

my $session = Net::Telnet::Cisco-&gt;new(Host =&gt; '123.123.123.123');
$session-&gt;login('login', 'password');

# Execute a command
my @output = $session-&gt;cmd('show version');
print @output;

# Enable mode
if ($session-&gt;enable(\&quot;enable_password\&quot;) ) {
@output = $session-&gt;cmd('show privilege');
print \&quot;My privileges: @output\n\&quot;;
} else {
warn \&quot;Can't enable: \&quot; . $session-&gt;errmsg;
}

$session-&gt;close;
========================================

Si vous avez une idée sur comment mettre en place ce script, je vous remercie par avance de me faire un retour.

Merci par avance,

Cordialement,

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.047 secondes
Propulsé par Kunena