mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-21 13:05:04 -05:00
plink can now execute a specific command instead of just a shell session
[originally from svn r576]
This commit is contained in:
parent
8394a48620
commit
be711d9cd4
1
putty.h
1
putty.h
@ -134,6 +134,7 @@ typedef struct {
|
|||||||
int close_on_exit;
|
int close_on_exit;
|
||||||
int warn_on_close;
|
int warn_on_close;
|
||||||
/* SSH options */
|
/* SSH options */
|
||||||
|
char remote_cmd[512];
|
||||||
int nopty;
|
int nopty;
|
||||||
enum { CIPHER_3DES, CIPHER_BLOWFISH, CIPHER_DES } cipher;
|
enum { CIPHER_3DES, CIPHER_BLOWFISH, CIPHER_DES } cipher;
|
||||||
char keyfile[FILENAME_MAX];
|
char keyfile[FILENAME_MAX];
|
||||||
|
38
ssh.c
38
ssh.c
@ -221,6 +221,7 @@ struct Packet {
|
|||||||
static struct Packet pktin = { 0, 0, NULL, NULL, 0 };
|
static struct Packet pktin = { 0, 0, NULL, NULL, 0 };
|
||||||
static struct Packet pktout = { 0, 0, NULL, NULL, 0 };
|
static struct Packet pktout = { 0, 0, NULL, NULL, 0 };
|
||||||
|
|
||||||
|
static int ssh_version;
|
||||||
static void (*ssh_protocol)(unsigned char *in, int inlen, int ispkt);
|
static void (*ssh_protocol)(unsigned char *in, int inlen, int ispkt);
|
||||||
static void ssh1_protocol(unsigned char *in, int inlen, int ispkt);
|
static void ssh1_protocol(unsigned char *in, int inlen, int ispkt);
|
||||||
static void ssh2_protocol(unsigned char *in, int inlen, int ispkt);
|
static void ssh2_protocol(unsigned char *in, int inlen, int ispkt);
|
||||||
@ -972,6 +973,7 @@ static int do_ssh_init(void) {
|
|||||||
logevent("Using SSH protocol version 2");
|
logevent("Using SSH protocol version 2");
|
||||||
s_write(vstring, strlen(vstring));
|
s_write(vstring, strlen(vstring));
|
||||||
ssh_protocol = ssh2_protocol;
|
ssh_protocol = ssh2_protocol;
|
||||||
|
ssh_version = 2;
|
||||||
s_rdpkt = ssh2_rdpkt;
|
s_rdpkt = ssh2_rdpkt;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
@ -985,6 +987,7 @@ static int do_ssh_init(void) {
|
|||||||
logevent("Using SSH protocol version 1");
|
logevent("Using SSH protocol version 1");
|
||||||
s_write(vstring, strlen(vstring));
|
s_write(vstring, strlen(vstring));
|
||||||
ssh_protocol = ssh1_protocol;
|
ssh_protocol = ssh1_protocol;
|
||||||
|
ssh_version = 1;
|
||||||
s_rdpkt = ssh1_rdpkt;
|
s_rdpkt = ssh1_rdpkt;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -1398,7 +1401,10 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt) {
|
|||||||
logevent("Allocated pty");
|
logevent("Allocated pty");
|
||||||
}
|
}
|
||||||
|
|
||||||
send_packet(SSH1_CMSG_EXEC_SHELL, PKT_END);
|
if (*cfg.remote_cmd)
|
||||||
|
send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cfg.remote_cmd, PKT_END);
|
||||||
|
else
|
||||||
|
send_packet(SSH1_CMSG_EXEC_SHELL, PKT_END);
|
||||||
logevent("Started session");
|
logevent("Started session");
|
||||||
|
|
||||||
ssh_state = SSH_STATE_SESSION;
|
ssh_state = SSH_STATE_SESSION;
|
||||||
@ -1743,12 +1749,16 @@ static int do_ssh2_transport(unsigned char *in, int inlen, int ispkt)
|
|||||||
crFinish(1);
|
crFinish(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SSH2: remote identifier for the main session channel.
|
||||||
|
*/
|
||||||
|
static unsigned long ssh_remote_channel;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle the SSH2 userauth and connection layers.
|
* Handle the SSH2 userauth and connection layers.
|
||||||
*/
|
*/
|
||||||
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||||
{
|
{
|
||||||
static unsigned long their_channel;
|
|
||||||
static unsigned long remote_winsize;
|
static unsigned long remote_winsize;
|
||||||
static unsigned long remote_maxpkt;
|
static unsigned long remote_maxpkt;
|
||||||
|
|
||||||
@ -1909,7 +1919,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
if (ssh2_pkt_getuint32() != 100) {
|
if (ssh2_pkt_getuint32() != 100) {
|
||||||
fatalbox("Server's channel confirmation cited wrong channel");
|
fatalbox("Server's channel confirmation cited wrong channel");
|
||||||
}
|
}
|
||||||
their_channel = ssh2_pkt_getuint32();
|
ssh_remote_channel = ssh2_pkt_getuint32();
|
||||||
remote_winsize = ssh2_pkt_getuint32();
|
remote_winsize = ssh2_pkt_getuint32();
|
||||||
remote_maxpkt = ssh2_pkt_getuint32();
|
remote_maxpkt = ssh2_pkt_getuint32();
|
||||||
logevent("Opened channel for session");
|
logevent("Opened channel for session");
|
||||||
@ -1918,7 +1928,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
* Now allocate a pty for the session.
|
* Now allocate a pty for the session.
|
||||||
*/
|
*/
|
||||||
ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
|
ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
|
||||||
ssh2_pkt_adduint32(their_channel); /* recipient channel */
|
ssh2_pkt_adduint32(ssh_remote_channel); /* recipient channel */
|
||||||
ssh2_pkt_addstring("pty-req");
|
ssh2_pkt_addstring("pty-req");
|
||||||
ssh2_pkt_addbool(1); /* want reply */
|
ssh2_pkt_addbool(1); /* want reply */
|
||||||
ssh2_pkt_addstring(cfg.termtype);
|
ssh2_pkt_addstring(cfg.termtype);
|
||||||
@ -1947,7 +1957,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
* Start a shell.
|
* Start a shell.
|
||||||
*/
|
*/
|
||||||
ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
|
ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
|
||||||
ssh2_pkt_adduint32(their_channel); /* recipient channel */
|
ssh2_pkt_adduint32(ssh_remote_channel); /* recipient channel */
|
||||||
ssh2_pkt_addstring("shell");
|
ssh2_pkt_addstring("shell");
|
||||||
ssh2_pkt_addbool(1); /* want reply */
|
ssh2_pkt_addbool(1); /* want reply */
|
||||||
ssh2_pkt_send();
|
ssh2_pkt_send();
|
||||||
@ -1994,7 +2004,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
} else {
|
} else {
|
||||||
/* FIXME: for now, ignore window size */
|
/* FIXME: for now, ignore window size */
|
||||||
ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
|
ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
|
||||||
ssh2_pkt_adduint32(their_channel);
|
ssh2_pkt_adduint32(ssh_remote_channel);
|
||||||
ssh2_pkt_addstring_start();
|
ssh2_pkt_addstring_start();
|
||||||
ssh2_pkt_addstring_data(in, inlen);
|
ssh2_pkt_addstring_data(in, inlen);
|
||||||
ssh2_pkt_send();
|
ssh2_pkt_send();
|
||||||
@ -2120,10 +2130,22 @@ static void ssh_size(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (Send Telnet special codes)
|
* Send Telnet special codes. TS_EOF is useful for `plink', so you
|
||||||
|
* can send an EOF and collect resulting output (e.g. `plink
|
||||||
|
* hostname sort').
|
||||||
*/
|
*/
|
||||||
static void ssh_special (Telnet_Special code) {
|
static void ssh_special (Telnet_Special code) {
|
||||||
/* do nothing */
|
if (code == TS_EOF) {
|
||||||
|
if (ssh_version = 1) {
|
||||||
|
send_packet(SSH1_CMSG_EOF, PKT_END);
|
||||||
|
} else {
|
||||||
|
ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF);
|
||||||
|
ssh2_pkt_adduint32(ssh_remote_channel);
|
||||||
|
ssh2_pkt_send();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
2
windlg.c
2
windlg.c
@ -149,6 +149,7 @@ static void save_settings (char *section, int do_host) {
|
|||||||
}
|
}
|
||||||
wpps (sesskey, "UserName", cfg.username);
|
wpps (sesskey, "UserName", cfg.username);
|
||||||
wppi (sesskey, "NoPTY", cfg.nopty);
|
wppi (sesskey, "NoPTY", cfg.nopty);
|
||||||
|
wpps (sesskey, "RemoteCmd", cfg.remote_cmd);
|
||||||
wpps (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" :
|
wpps (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" :
|
||||||
cfg.cipher == CIPHER_DES ? "des" : "3des");
|
cfg.cipher == CIPHER_DES ? "des" : "3des");
|
||||||
wppi (sesskey, "AuthTIS", cfg.try_tis_auth);
|
wppi (sesskey, "AuthTIS", cfg.try_tis_auth);
|
||||||
@ -283,6 +284,7 @@ static void load_settings (char *section, int do_host) {
|
|||||||
}
|
}
|
||||||
gpps (sesskey, "UserName", "", cfg.username, sizeof(cfg.username));
|
gpps (sesskey, "UserName", "", cfg.username, sizeof(cfg.username));
|
||||||
gppi (sesskey, "NoPTY", 0, &cfg.nopty);
|
gppi (sesskey, "NoPTY", 0, &cfg.nopty);
|
||||||
|
gpps (sesskey, "RemoteCmd", "", cfg.remote_cmd, sizeof(cfg.remote_cmd));
|
||||||
{
|
{
|
||||||
char cipher[10];
|
char cipher[10];
|
||||||
gpps (sesskey, "Cipher", "3des", cipher, 10);
|
gpps (sesskey, "Cipher", "3des", cipher, 10);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user