-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSshBase.php
More file actions
193 lines (155 loc) · 4.11 KB
/
SshBase.php
File metadata and controls
193 lines (155 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?php
declare(strict_types=1);
namespace Sandesh\Ssh;
use InvalidArgumentException;
abstract class SshBase
{
protected const ERROR_PRIVATE_KEY = 'Error authenticating with private key.';
protected const ERROR_PASSWORD = 'Error authenticating with password.';
protected const ERROR_NOT_CONNECTED = 'Not connected to server.';
protected const ERROR_DISCONNECT = 'Could not disconnect. Not connected to server.';
/**
* The host of the SSH server.
*/
protected string $host;
/**
* The port number of the SSH server. Defaults to 22.
*/
protected int $port = 22;
/**
* The username to use for the SSH connection.
*/
protected string $username;
/**
* The password to use for the SSH connection.
*/
protected string $password;
/**
* The private key to use for the SSH connection.
*/
protected string $privateKey;
/**
* The timeout in seconds for the SSH connection. Defaults to 10.
*/
protected int $timeout = 10;
/**
* The Keep Alive Interval in seconds for the SSH connection. Defaults to 10.
*/
protected int $keepAlive = 10;
/**
* Whether the SSH connection has been established.
*/
protected bool $connected = false;
/**
* Sets the host of the SSH server.
*
* @return $this
*/
public function host(string $host): self
{
$this->host = $host;
return $this;
}
/**
* Sets the port number of the SSH server. Defaults to 22.
*
* @return $this
*/
public function port(int $port): self
{
$this->port = $port;
return $this;
}
/**
* Sets the user.
*
* @return $this
*/
public function user(string $username): self
{
$this->username = $username;
return $this;
}
/**
* Sets the password.
*
* @return $this
*/
public function password(string $password): self
{
$this->password = $password;
return $this;
}
/**
* Sets the private key as a string.
*
* @return $this
*/
public function privateKey(string $privateKey): self
{
$this->privateKey = $privateKey;
return $this;
}
/**
* Sets the path to a private key file.
*
* @return $this
*/
public function privateKeyPath(string $privateKeyPath): self
{
// Prepare private key from path
if (! empty($privateKeyPath)) {
$keyContent = file_get_contents($privateKeyPath);
$keyContent = is_string($keyContent) ? $keyContent : '';
$this->privateKey = $keyContent;
}
return $this;
}
/**
* Sets the timeout in seconds for the SSH connection. Defaults to 10.
*
* @return $this
*/
public function timeout(int $timeout): self
{
$this->timeout = $timeout;
return $this;
}
/**
* Returns true if the connection is established, false otherwise.
*/
public function isConnected(): bool
{
return $this->connected;
}
/**
* Connect to remote server.
*/
abstract public function connect(): self;
/**
* Disconnects from the remote server.
*/
abstract public function disconnect(): void;
abstract public function keepAlive($interval): self;
/**
* Validates the connection arguments.
* If any of the required arguments are empty, an exception will be thrown.
*
* @throws InvalidArgumentException
*/
protected function validateArguments(): void
{
if (empty($this->host)) {
throw new InvalidArgumentException('Host is required');
}
if (empty($this->port)) {
throw new InvalidArgumentException('Port is required');
}
if (empty($this->username)) {
throw new InvalidArgumentException('Username is required');
}
if (empty($this->password) && empty($this->privateKey)) {
throw new InvalidArgumentException('Password, private key or private key path is required');
}
}
}