front
cinap_lenrek 2019-04-02 09:05:01 +02:00
commit ccbffa6731
2 changed files with 80 additions and 38 deletions

View File

@ -23,6 +23,9 @@ ssh - secure shell remote login client
] [
.IR user @] host
[
.B -W
.I remote!port
] [
.I cmd
.I args
.I ...
@ -83,6 +86,13 @@ with the
.B -r
option.
.PP
With the
.B -W
option, instead of executing a command remotely, makes
the server dial a tcp connection to
.I remote!port
which the client relays on standard input and output.
.PP
The
.B -d
option enables debug output.

View File

@ -80,8 +80,8 @@ int nsid;
uchar sid[256];
char thumb[2*SHA2_256dlen+1], *thumbfile;
int fd, intr, raw, debug;
char *user, *service, *status, *host, *cmd;
int fd, intr, raw, port, debug;
char *user, *service, *status, *host, *remote, *cmd;
Oneway recv, send;
void dispatch(void);
@ -1147,7 +1147,7 @@ kfmt(Fmt *f)
void
usage(void)
{
fprint(2, "usage: %s [-dR] [-t thumbfile] [-T tries] [-u user] [-h] [user@]host [cmd args...]\n", argv0);
fprint(2, "usage: %s [-dR] [-t thumbfile] [-T tries] [-u user] [-h] [user@]host [-W remote!port] [cmd args...]\n", argv0);
exits("usage");
}
@ -1173,6 +1173,17 @@ main(int argc, char *argv[])
case 'd':
debug++;
break;
case 'W':
remote = EARGF(usage());
s = strrchr(remote, '!');
if(s == nil)
s = strrchr(remote, ':');
if(s == nil)
usage();
*s++ = 0;
port = atoi(s);
raw = 0;
break;
case 'R':
raw = 0;
break;
@ -1221,6 +1232,9 @@ main(int argc, char *argv[])
}
}
if(remote != nil && cmd != nil)
usage();
if((fd = dial(netmkaddr(host, nil, "ssh"), nil, nil, nil)) < 0)
sysfatal("dial: %r");
@ -1260,11 +1274,27 @@ Next0: switch(recvpkt()){
recv.chan = 0;
/* open hailing frequencies */
sendpkt("bsuuu", MSG_CHANNEL_OPEN,
"session", 7,
recv.chan,
recv.win,
recv.pkt);
if(remote != nil){
NetConnInfo *nci = getnetconninfo(nil, fd);
if(nci == nil)
sysfatal("can't get netconninfo: %r");
sendpkt("bsuuususu", MSG_CHANNEL_OPEN,
"direct-tcpip", 12,
recv.chan,
recv.win,
recv.pkt,
remote, strlen(remote),
port,
nci->laddr, strlen(nci->laddr),
atoi(nci->lserv));
free(nci);
} else {
sendpkt("bsuuu", MSG_CHANNEL_OPEN,
"session", 7,
recv.chan,
recv.win,
recv.pkt);
}
Next1: switch(recvpkt()){
default:
@ -1307,36 +1337,38 @@ Next1: switch(recvpkt()){
/* child reads input and sends packets */
qlock(&sl);
if(raw) {
rawon();
sendpkt("busbsuuuus", MSG_CHANNEL_REQUEST,
send.chan,
"pty-req", 7,
0,
tty.term, strlen(tty.term),
tty.cols,
tty.lines,
tty.xpixels,
tty.ypixels,
"", 0);
}
if(cmd == nil){
sendpkt("busb", MSG_CHANNEL_REQUEST,
send.chan,
"shell", 5,
0);
} else if(*cmd == '#') {
sendpkt("busbs", MSG_CHANNEL_REQUEST,
send.chan,
"subsystem", 9,
0,
cmd+1, strlen(cmd)-1);
} else {
sendpkt("busbs", MSG_CHANNEL_REQUEST,
send.chan,
"exec", 4,
0,
cmd, strlen(cmd));
if(remote == nil){
if(raw) {
rawon();
sendpkt("busbsuuuus", MSG_CHANNEL_REQUEST,
send.chan,
"pty-req", 7,
0,
tty.term, strlen(tty.term),
tty.cols,
tty.lines,
tty.xpixels,
tty.ypixels,
"", 0);
}
if(cmd == nil){
sendpkt("busb", MSG_CHANNEL_REQUEST,
send.chan,
"shell", 5,
0);
} else if(*cmd == '#') {
sendpkt("busbs", MSG_CHANNEL_REQUEST,
send.chan,
"subsystem", 9,
0,
cmd+1, strlen(cmd)-1);
} else {
sendpkt("busbs", MSG_CHANNEL_REQUEST,
send.chan,
"exec", 4,
0,
cmd, strlen(cmd));
}
}
for(;;){
static uchar buf[MaxPacket];