Question
Utilisation de Telnet/ping in PowerShell
- moti
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 2
- Remerciements reçus 0
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.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
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.
- Arthur
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
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.
Connexion ou Créer un compte pour participer à la conversation.
- Alan Pinard
- Hors Ligne
- Membre senior
-
- Messages : 77
- Remerciements reçus 0
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 \"Veillez indiquer un adresse de serveur enutilisant l'option -Server <IP>\"}
ElseIf ($Username -eq $Null){Throw \"Aucun nom d'usager n'a été indiqué, utiliser l'option -Username <Nom_D'usager>\"}
ElseIf ($Password -eq $Null){Throw \"Aucun mot de passe n'a été indiqué, utiliser l'option -Password <MotDePasse>\"}
ElseIf ($PLinkPath -eq $Null){Throw \"Plink.exe est introuvable, utiliser l'option -PlinkPath <Drive:\Folder\plink.exe>\"}
ElseIf (($PlinkCmd -eq $Null) -and ($CmdFile -eq $Null)){Throw \"Aucune command ne sera envoyé à Plink.exe, utiliser l'option -PlinkCmd <ls /tmp> ou l'option -CmdFile <Drive:\Folder\CmdFile.txt>\"}
}
PROCESS {
$PlinkSShOptions = \"\"
$Password = $Password.Insert(0,\"-pw \"«»)
If($Verbose -ne $Null){
If($Verbose -eq \"Disable\"«») {
$Verbose = \"\"
}
ElseIf ($Verbose -eq \"Enable\"«») {
$Verbose = \"-v \"
$PlinkSShCmd.Length
$PlinkSShOptions.Insert(($PlinkSShOptions.Length), $Verbose)
}
Else {
Throw \"L'option -Verbose peut être [Enable | Disable]. Ex: -Verbose Disable\"
}
}
If($X -ne $Null){
If($X -eq \"Disable\"«») {
$X = \"-x \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $X)
}
ElseIf ($X -eq \"Enable\"«») {
$X = \"-X \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShCmd.Length, $X)
}
Else {Throw \"L'option -X peut être [Enable | Disable]. Ex: -X Disable\"}
}
If($A -ne $Null){
If($A -eq \"Disable\"«») {
$A = \"-a \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $A)
}
ElseIf ($A -eq \"Enable\"«») {
$A = \"-A \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $A)
}
Else {Throw \"L'option -A peut être [Enable | Disable]. Ex: -A Disable\"}
}
If($T -ne $Null){
If($T -eq \"Disable\"«») {
$T = \"-t \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $T)
}
ElseIf ($T -eq \"Enable\"«») {
$T = \"-T \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $T)
}
Else {Throw \"L'option -T peut être [Enable | Disable]. Ex: -T Disable\"}
}
If($ProtocolVersion -ne $Null){
If($ProtocolVersion -eq \"2\"«») {
$ProtocolVersion = \"-2 \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $ProtocolVersion)
}
ElseIf ($ProtocolVersion -eq \"1\"«») {
$ProtocolVersion = \"-1 \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $ProtocolVersion)
}
Else {Throw \"L'option -ProtocolVersion peut être [1 | 2]. Ex: -ProtocolVersion 2\"}
}
If($Compression -ne $Null){
If($Compression -eq \"Disable\"«») {
$Compression = $Null
}
ElseIf ($Compression -eq \"Enable\"«») {
$Compression = \"-C \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Compression)
}
Else {Throw \"L'option -Compression peut être [Enable | Disable]. Ex: -Compression Disable\"}
}
If($Pageant -ne $Null){
If($Pageant -eq \"Disable\"«») {
$Pageant = \"-noagent \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Pageant)
}
ElseIf ($Pageant -eq \"Enable\"«») {
$Pageant = \"-agent \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Pageant)
}
Else {Throw \"L'option -Pageant peut être [Enable | Disable]. Ex: -Pageant Disable\"}
}
If($Interactive -ne $Null){
If($Interactive -eq \"Disable\"«») {
$Interactive = $Null
}
ElseIF ($Interactive -eq \"Enable\"«») {
$Interactive = \"-batch \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Interactive)
}
Else {Throw \"L'option -Interactive peut être [Enable | Disable]. Ex: -Interactive Disable\"}
}
If($Port -ne $Null){
If($Port -eq \"22\"«»){$Port = $Null
}
Else {
$Port = \"-P $Port \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Port)
Write-Host -ForegroundColor Yellow \"Port :\"$PlinkSShOptions
}
}
If($Protocol -ne $Null){
If($Protocol -eq \"ssh\"«»){
$Protocol = \"-ssh \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Protocol)
}
ElseIf($Protocol -eq \"telnet\"«»){
$Protocol = \"-telnet \"
}
ElseIf($Protocol -eq \"rlogin\"«»){
$Protocol = \"-rlogon \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Protocol)
}
ElseIf($Protocol -eq \"raw\"«»){
$Protocol = \"-raw \"
$PlinkSShOptions = $PlinkSShOptions.Insert($PlinkSShOptions.Length, $Protocol)
}
Else {
$Protocol = $Null
}
}
Write-Host $PlinkSShOptions
$PlinkSShCmd = $PlinkPath + \" \" + $PlinkSShOptions + \" \" + $Password + \" \" + $Username + \"@\" + $Server + \" \" + $PlinkCmd
Write-Host -ForegroundColor Cyan \"Commande envoyé par PLink.exe ->\"$PlinkSShCmd
$ConMsgCmd_PlinkSShCmd = Invoke-Expression -Command $PlinkSShCmd
}
END {
Return $ConMsgCmd_PlinkSShCmd
}
}
[/code:1]
Voici un exemple d'appel de la fonction:
VA-PlinkSSHCmd -PLinkPath \"D:\Source\PLink\Plink.exe\" -Interactive \"Enable\" -ProtocolVersion \"2\" -Username \"root\" -Password \"toor\" -Server \"Server.mondomaine.local\" -PlinkCmd \"df -h\" -Compression \"Enable\"
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 = \"localhost\",
[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 = \"\"
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 = @\"
username
password
ping server1
\"@
$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.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
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 }
\\"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.
- moti
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 2
- Remerciements reçus 0
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->new(Host => '123.123.123.123');
$session->login('login', 'password');
# Execute a command
my @output = $session->cmd('show version');
print @output;
# Enable mode
if ($session->enable(\"enable_password\") ) {
@output = $session->cmd('show privilege');
print \"My privileges: @output\n\";
} else {
warn \"Can't enable: \" . $session->errmsg;
}
$session->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.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Utilisation de Telnet/ping in PowerShell