提交 6b01c83a 编写于 作者: O Oskari Saarenmaa 提交者: Eric Blake

remote/ssh: optional "keyfile" parameter.

New optional parameter "keyfile" for ssh transport allows the user to select
the private key to be used to authenticate to the remote host.
上级 f7e18208
...@@ -275,6 +275,22 @@ Note that parameter values must be ...@@ -275,6 +275,22 @@ Note that parameter values must be
<td colspan="2"/> <td colspan="2"/>
<td> Example: <code>netcat=/opt/netcat/bin/nc</code> </td> <td> Example: <code>netcat=/opt/netcat/bin/nc</code> </td>
</tr> </tr>
<tr>
<td>
<code>keyfile</code>
</td>
<td> ssh </td>
<td>
The name of the private key file to use to authentication to the remote
machine. If this option is not used the default keys are used.
</td>
</tr>
<tr>
<td colspan="2"/>
<td> Example: <code>keyfile=/root/.ssh/example_key</code> </td>
</tr>
<tr> <tr>
<td> <td>
<code>no_verify</code> <code>no_verify</code>
......
...@@ -352,7 +352,7 @@ doRemoteOpen (virConnectPtr conn, ...@@ -352,7 +352,7 @@ doRemoteOpen (virConnectPtr conn,
char *name = NULL, *command = NULL, *sockname = NULL, *netcat = NULL; char *name = NULL, *command = NULL, *sockname = NULL, *netcat = NULL;
char *port = NULL, *authtype = NULL, *username = NULL; char *port = NULL, *authtype = NULL, *username = NULL;
int no_verify = 0, no_tty = 0; int no_verify = 0, no_tty = 0;
char *pkipath = NULL; char *pkipath = NULL, *keyfile = NULL;
/* Return code from this function, and the private data. */ /* Return code from this function, and the private data. */
int retcode = VIR_DRV_OPEN_ERROR; int retcode = VIR_DRV_OPEN_ERROR;
...@@ -425,6 +425,11 @@ doRemoteOpen (virConnectPtr conn, ...@@ -425,6 +425,11 @@ doRemoteOpen (virConnectPtr conn,
netcat = strdup (var->value); netcat = strdup (var->value);
if (!netcat) goto out_of_memory; if (!netcat) goto out_of_memory;
var->ignore = 1; var->ignore = 1;
} else if (STRCASEEQ (var->name, "keyfile")) {
VIR_FREE(keyfile);
keyfile = strdup (var->value);
if (!keyfile) goto out_of_memory;
var->ignore = 1;
} else if (STRCASEEQ (var->name, "no_verify")) { } else if (STRCASEEQ (var->name, "no_verify")) {
no_verify = atoi (var->value); no_verify = atoi (var->value);
var->ignore = 1; var->ignore = 1;
...@@ -582,6 +587,7 @@ doRemoteOpen (virConnectPtr conn, ...@@ -582,6 +587,7 @@ doRemoteOpen (virConnectPtr conn,
no_tty, no_tty,
no_verify, no_verify,
netcat ? netcat : "nc", netcat ? netcat : "nc",
keyfile,
sockname))) sockname)))
goto failed; goto failed;
...@@ -681,6 +687,7 @@ doRemoteOpen (virConnectPtr conn, ...@@ -681,6 +687,7 @@ doRemoteOpen (virConnectPtr conn,
VIR_FREE(sockname); VIR_FREE(sockname);
VIR_FREE(authtype); VIR_FREE(authtype);
VIR_FREE(netcat); VIR_FREE(netcat);
VIR_FREE(keyfile);
VIR_FREE(username); VIR_FREE(username);
VIR_FREE(port); VIR_FREE(port);
VIR_FREE(pkipath); VIR_FREE(pkipath);
......
...@@ -201,11 +201,13 @@ virNetClientPtr virNetClientNewSSH(const char *nodename, ...@@ -201,11 +201,13 @@ virNetClientPtr virNetClientNewSSH(const char *nodename,
bool noTTY, bool noTTY,
bool noVerify, bool noVerify,
const char *netcat, const char *netcat,
const char *keyfile,
const char *path) const char *path)
{ {
virNetSocketPtr sock; virNetSocketPtr sock;
if (virNetSocketNewConnectSSH(nodename, service, binary, username, noTTY, noVerify, netcat, path, &sock) < 0) if (virNetSocketNewConnectSSH(nodename, service, binary, username, noTTY,
noVerify, netcat, keyfile, path, &sock) < 0)
return NULL; return NULL;
return virNetClientNew(sock, NULL); return virNetClientNew(sock, NULL);
......
...@@ -46,6 +46,7 @@ virNetClientPtr virNetClientNewSSH(const char *nodename, ...@@ -46,6 +46,7 @@ virNetClientPtr virNetClientNewSSH(const char *nodename,
bool noTTY, bool noTTY,
bool noVerify, bool noVerify,
const char *netcat, const char *netcat,
const char *keyfile,
const char *path); const char *path);
virNetClientPtr virNetClientNewExternal(const char **cmdargv); virNetClientPtr virNetClientNewExternal(const char **cmdargv);
......
...@@ -594,6 +594,7 @@ int virNetSocketNewConnectSSH(const char *nodename, ...@@ -594,6 +594,7 @@ int virNetSocketNewConnectSSH(const char *nodename,
bool noTTY, bool noTTY,
bool noVerify, bool noVerify,
const char *netcat, const char *netcat,
const char *keyfile,
const char *path, const char *path,
virNetSocketPtr *retsock) virNetSocketPtr *retsock)
{ {
...@@ -611,6 +612,8 @@ int virNetSocketNewConnectSSH(const char *nodename, ...@@ -611,6 +612,8 @@ int virNetSocketNewConnectSSH(const char *nodename,
virCommandAddArgList(cmd, "-p", service, NULL); virCommandAddArgList(cmd, "-p", service, NULL);
if (username) if (username)
virCommandAddArgList(cmd, "-l", username, NULL); virCommandAddArgList(cmd, "-l", username, NULL);
if (keyfile)
virCommandAddArgList(cmd, "-i", keyfile, NULL);
if (noTTY) if (noTTY)
virCommandAddArgList(cmd, "-T", "-o", "BatchMode=yes", virCommandAddArgList(cmd, "-T", "-o", "BatchMode=yes",
"-e", "none", NULL); "-e", "none", NULL);
......
...@@ -69,6 +69,7 @@ int virNetSocketNewConnectSSH(const char *nodename, ...@@ -69,6 +69,7 @@ int virNetSocketNewConnectSSH(const char *nodename,
bool noTTY, bool noTTY,
bool noVerify, bool noVerify,
const char *netcat, const char *netcat,
const char *keyfile,
const char *path, const char *path,
virNetSocketPtr *addr); virNetSocketPtr *addr);
......
...@@ -379,6 +379,7 @@ struct testSSHData { ...@@ -379,6 +379,7 @@ struct testSSHData {
bool noTTY; bool noTTY;
bool noVerify; bool noVerify;
const char *netcat; const char *netcat;
const char *keyfile;
const char *path; const char *path;
const char *expectOut; const char *expectOut;
...@@ -400,6 +401,7 @@ static int testSocketSSH(const void *opaque) ...@@ -400,6 +401,7 @@ static int testSocketSSH(const void *opaque)
data->noTTY, data->noTTY,
data->noVerify, data->noVerify,
data->netcat, data->netcat,
data->keyfile,
data->path, data->path,
&csock) < 0) &csock) < 0)
goto cleanup; goto cleanup;
...@@ -542,6 +544,16 @@ mymain(void) ...@@ -542,6 +544,16 @@ mymain(void)
if (virtTestRun("SSH test 5", 1, testSocketSSH, &sshData5) < 0) if (virtTestRun("SSH test 5", 1, testSocketSSH, &sshData5) < 0)
ret = -1; ret = -1;
struct testSSHData sshData6 = {
.nodename = "example.com",
.path = "/tmp/socket",
.keyfile = "/root/.ssh/example_key",
.noVerify = true,
.expectOut = "-i /root/.ssh/example_key -o StrictHostKeyChecking=no example.com nc -U /tmp/socket\n",
};
if (virtTestRun("SSH test 6", 1, testSocketSSH, &sshData6) < 0)
ret = -1;
#endif #endif
return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册