class

SSH::Connection

Inherits Reference < Object

Connexion SSH isolée vers un hôte distant.

Contrairement à un ssh lancé à la main, cette connexion ignore totalement l'environnement utilisateur :

  • ~/.ssh/config n'est pas lu (-F /dev/null)
  • ~/.ssh/known_hosts n'est pas lu ni écrit (UserKnownHostsFile=/dev/null, GlobalKnownHostsFile=/dev/null)
  • ssh-agent est ignoré (IdentityAgent=none)
  • seule la clé passée en identity_file est essayée (IdentitiesOnly=yes)
  • aucun prompt interactif n'est possible (BatchMode=yes : ni mot de passe, ni keyboard-interactive, ni confirmation de clé)
  • les changements de clé d'hôte ne bloquent pas (StrictHostKeyChecking=no) — adapté aux flows rescue/bootstrap où la clé change à chaque reboot

Conséquence pratique : deux postes avec des configurations ssh différentes exécuteront le même code de la même manière. Aucune pollution croisée avec les sessions interactives de l'utilisateur.

Sécurité : StrictHostKeyChecking=no laisse théoriquement la porte à un MITM entre le poste et l'hôte distant. Ce wrapper est prévu pour des outils de provisioning qui parlent à des rescue ou des images fraîchement installées — contextes où la clé d'hôte n'est de toute façon pas stable. Si vous avez besoin de vérifier une clé d'hôte stable, utilisez ssh directement, pas ce shard.

Constants

FORCED_OPTIONS = {"StrictHostKeyChecking" => "no", "UserKnownHostsFile" => "/dev/null", "GlobalKnownHostsFile" => "/dev/null", "LogLevel" => "ERROR", "BatchMode" => "yes", "IdentitiesOnly" => "yes", "IdentityAgent" => "none", "ConnectTimeout" => "10", "ControlMaster" => "auto", "ControlPath" => "/tmp/ssh-%C-%i", "ControlPersist" => "10m"}

Options ssh forcées sur toutes les connexions. L'appelant peut ajouter des options via le paramètre options, mais celles-ci ne peuvent pas être écrasées (elles sont ajoutées après pour gagner par ordre d'apparition côté ssh -o).

Constructors

new(host : String, user : String = "root", port : Int32 = 22, identity_file : String | Nil = nil, options : Hash(String, String) = {} of String => String)

Crée une connexion vers host pour l'utilisateur user sur le port port. Si identity_file est fourni, il est passé en -i et aucune autre clé n'est essayée (grâce à IdentitiesOnly=yes). Sinon aucune clé n'est fournie → l'auth publickey échouera avec un message clair (cas « pas de clé résoluble »).

Source

Instance methods

download(remote_path : String, local_path : String) : Nil

Récupère un fichier distant via scp.

Source
exec(command : String, stdin : String | Nil = nil, raise_on_error : Bool = true) : Result

Exécute une commande distante. Lève CommandFailed si exit_code != 0, sauf si raise_on_error: false.

stdin : contenu à piper sur l'entrée standard distante. Quand fourni, on n'ajoute pas -n à l'appel ssh (sinon le pipe est court-circuité). Quand absent, on passe -n pour fermer stdin à la source — indispensable sur macOS où Process.run peut laisser le canal ssh ouvert.

Source
host
Source
identity_file
Source
options
Source
port
Source
scp_args(source : String, destination : String) : Array(String)

Liste des arguments passés au binaire scp pour transférer source vers destination. Exposée pour les tests.

Source
ssh_args(command : String) : Array(String)

Liste des arguments passés au binaire ssh pour exécuter command. Exposée pour permettre l'inspection et les tests.

Source
upload(local_path : String, remote_path : String) : Nil

Transfère un fichier local vers la cible via scp.

Source
user
Source
write_file(remote_path : String, content : String, mode : String | Nil = nil) : Nil

Écrit content dans remote_path via cat > …. Si mode est fourni, chmode le fichier distant.

Source