sftp upload diff similar to scp
It's annoying to upload using interactive mode. This diff works like scp. sftp localfile user@host:dir Index: sftp.c === RCS file: /cvs/src/usr.bin/ssh/sftp.c,v retrieving revision 1.132 diff -u -p -r1.132 sftp.c --- sftp.c 4 Dec 2010 00:18:01 - 1.132 +++ sftp.c 19 Sep 2011 13:57:53 - @@ -25,6 +25,7 @@ #include ctype.h #include errno.h +#include fcntl.h #include glob.h #include histedit.h #include paths.h @@ -175,7 +176,7 @@ static const struct CMD cmds[] = { { NULL, -1, -1 } }; -int interactive_loop(struct sftp_conn *, char *file1, char *file2); +int interactive_loop(struct sftp_conn *, char *file1, char *file2, int); /* ARGSUSED */ static void @@ -1834,7 +1835,7 @@ complete(EditLine *el, int ch) } int -interactive_loop(struct sftp_conn *conn, char *file1, char *file2) +interactive_loop(struct sftp_conn *conn, char *file1, char *file2, int tflag) { char *remote_path; char *dir = NULL; @@ -1889,10 +1890,19 @@ interactive_loop(struct sftp_conn *conn, } } else { if (file2 == NULL) - snprintf(cmd, sizeof cmd, get %s, dir); + if (tflag == 0) + snprintf(cmd, sizeof cmd, get %s, +dir); + else + snprintf(cmd, sizeof cmd, put %s, +dir); else - snprintf(cmd, sizeof cmd, get %s %s, dir, - file2); + if (tflag == 0) + snprintf(cmd, sizeof cmd, get %s %s, +dir, file2); + else + snprintf(cmd, sizeof cmd, put %s %s, +dir, file2); err = parse_dispatch_command(conn, cmd, remote_path, 1); @@ -2034,12 +2044,13 @@ usage(void) int main(int argc, char **argv) { - int in, out, ch, err; + int in, out, ch, tflag = 0, fd, err; char *host = NULL, *userhost, *cp, *file2 = NULL; int debug_level = 0, sshver = 2; char *file1 = NULL, *sftp_server = NULL; char *ssh_program = _PATH_SSH_PROGRAM, *sftp_direct = NULL; const char *errstr; + char path[MAXPATHLEN]; LogLevel ll = SYSLOG_LEVEL_INFO; arglist args; extern int optind; @@ -2163,9 +2174,22 @@ main(int argc, char **argv) if (optind == argc || argc (optind + 2)) usage(); - userhost = xstrdup(argv[optind]); - file2 = argv[optind+1]; - + if (strrchr(argv[optind], '@') != NULL) { + userhost = xstrdup(argv[optind]); + file2 = argv[optind + 1]; + } + else { + tflag = 1; + userhost = xstrdup(argv[optind + 1]); + file2 = argv[optind]; + if ((fd = open(file2, O_RDONLY | O_NONBLOCK, 0)) 0) { + fprintf(stderr, \n%s\n,strerror(errno)); + _exit(1); + } + if (getcwd(path, sizeof(path)) != NULL + file2[0] != '/') + file2 = path_append(path, file2); + } if ((host = strrchr(userhost, '@')) == NULL) host = userhost; else { @@ -2219,9 +2243,10 @@ main(int argc, char **argv) else fprintf(stderr, Attached to %s.\n, sftp_direct); } - - err = interactive_loop(conn, file1, file2); - + if (tflag == 0) + err = interactive_loop(conn, file1, file2, 0); + else + err = interactive_loop(conn, file2, file1, 1); close(in); close(out); if (batchmode)
Re: sftp upload diff similar to scp
Not sure if I got this, but why not using scp then ? On 19 September 2011 14:52, elitter.net logana...@elitter.net wrote: It's annoying to upload using interactive mode. This diff works like scp. sftp localfile user@host:dir Index: sftp.c === RCS file: /cvs/src/usr.bin/ssh/sftp.c,v retrieving revision 1.132 diff -u -p -r1.132 sftp.c --- sftp.c 4 Dec 2010 00:18:01 - 1.132 +++ sftp.c 19 Sep 2011 13:57:53 - @@ -25,6 +25,7 @@ #include ctype.h #include errno.h +#include fcntl.h #include glob.h #include histedit.h #include paths.h @@ -175,7 +176,7 @@ static const struct CMD cmds[] = { { NULL, -1, -1 } }; -int interactive_loop(struct sftp_conn *, char *file1, char *file2); +int interactive_loop(struct sftp_conn *, char *file1, char *file2, int); /* ARGSUSED */ static void @@ -1834,7 +1835,7 @@ complete(EditLine *el, int ch) } int -interactive_loop(struct sftp_conn *conn, char *file1, char *file2) +interactive_loop(struct sftp_conn *conn, char *file1, char *file2, int tflag) { char *remote_path; char *dir = NULL; @@ -1889,10 +1890,19 @@ interactive_loop(struct sftp_conn *conn, } } else { if (file2 == NULL) - snprintf(cmd, sizeof cmd, get %s, dir); + if (tflag == 0) + snprintf(cmd, sizeof cmd, get %s, +dir); + else + snprintf(cmd, sizeof cmd, put %s, +dir); else - snprintf(cmd, sizeof cmd, get %s %s, dir, - file2); + if (tflag == 0) + snprintf(cmd, sizeof cmd, get %s %s, +dir, file2); + else + snprintf(cmd, sizeof cmd, put %s %s, +dir, file2); err = parse_dispatch_command(conn, cmd, remote_path, 1); @@ -2034,12 +2044,13 @@ usage(void) int main(int argc, char **argv) { - int in, out, ch, err; + int in, out, ch, tflag = 0, fd, err; char *host = NULL, *userhost, *cp, *file2 = NULL; int debug_level = 0, sshver = 2; char *file1 = NULL, *sftp_server = NULL; char *ssh_program = _PATH_SSH_PROGRAM, *sftp_direct = NULL; const char *errstr; + char path[MAXPATHLEN]; LogLevel ll = SYSLOG_LEVEL_INFO; arglist args; extern int optind; @@ -2163,9 +2174,22 @@ main(int argc, char **argv) if (optind == argc || argc (optind + 2)) usage(); - userhost = xstrdup(argv[optind]); - file2 = argv[optind+1]; - + if (strrchr(argv[optind], '@') != NULL) { + userhost = xstrdup(argv[optind]); + file2 = argv[optind + 1]; + } + else { + tflag = 1; + userhost = xstrdup(argv[optind + 1]); + file2 = argv[optind]; + if ((fd = open(file2, O_RDONLY | O_NONBLOCK, 0)) 0) { + fprintf(stderr, \n%s\n,strerror(errno)); + _exit(1); + } + if (getcwd(path, sizeof(path)) != NULL + file2[0] != '/') + file2 = path_append(path, file2); + } if ((host = strrchr(userhost, '@')) == NULL) host = userhost; else { @@ -2219,9 +2243,10 @@ main(int argc, char **argv) else fprintf(stderr, Attached to %s.\n, sftp_direct); } - - err = interactive_loop(conn, file1, file2); - + if (tflag == 0) + err = interactive_loop(conn, file1, file2, 0); + else + err = interactive_loop(conn, file2, file1, 1); close(in); close(out); if (batchmode)
Re: sftp upload diff similar to scp
SFTP is better designed IMHO. I agree that from a user's perspective, it doesn't really matter much :-) On Mon, Sep 19, 2011 at 11:29 PM, Christiano F. Haesbaert haesba...@haesbaert.org wrote: Not sure if I got this, but why not using scp then ? On 19 September 2011 14:52, elitter.net logana...@elitter.net wrote: It's annoying to upload using interactive mode. This diff works like scp. sftp localfile user@host:dir Index: sftp.c === RCS file: /cvs/src/usr.bin/ssh/sftp.c,v retrieving revision 1.132 diff -u -p -r1.132 sftp.c --- sftp.c 4 Dec 2010 00:18:01 - 1.132 +++ sftp.c 19 Sep 2011 13:57:53 - @@ -25,6 +25,7 @@ #include ctype.h #include errno.h +#include fcntl.h #include glob.h #include histedit.h #include paths.h @@ -175,7 +176,7 @@ static const struct CMD cmds[] = { { NULL, -1, -1 } }; -int interactive_loop(struct sftp_conn *, char *file1, char *file2); +int interactive_loop(struct sftp_conn *, char *file1, char *file2, int); /* ARGSUSED */ static void @@ -1834,7 +1835,7 @@ complete(EditLine *el, int ch) } int -interactive_loop(struct sftp_conn *conn, char *file1, char *file2) +interactive_loop(struct sftp_conn *conn, char *file1, char *file2, int tflag) { char *remote_path; char *dir = NULL; @@ -1889,10 +1890,19 @@ interactive_loop(struct sftp_conn *conn, } } else { if (file2 == NULL) - snprintf(cmd, sizeof cmd, get %s, dir); + if (tflag == 0) + snprintf(cmd, sizeof cmd, get %s, +dir); + else + snprintf(cmd, sizeof cmd, put %s, +dir); else - snprintf(cmd, sizeof cmd, get %s %s, dir, - file2); + if (tflag == 0) + snprintf(cmd, sizeof cmd, get %s %s, +dir, file2); + else + snprintf(cmd, sizeof cmd, put %s %s, +dir, file2); err = parse_dispatch_command(conn, cmd, remote_path, 1); @@ -2034,12 +2044,13 @@ usage(void) int main(int argc, char **argv) { - int in, out, ch, err; + int in, out, ch, tflag = 0, fd, err; char *host = NULL, *userhost, *cp, *file2 = NULL; int debug_level = 0, sshver = 2; char *file1 = NULL, *sftp_server = NULL; char *ssh_program = _PATH_SSH_PROGRAM, *sftp_direct = NULL; const char *errstr; + char path[MAXPATHLEN]; LogLevel ll = SYSLOG_LEVEL_INFO; arglist args; extern int optind; @@ -2163,9 +2174,22 @@ main(int argc, char **argv) if (optind == argc || argc (optind + 2)) usage(); - userhost = xstrdup(argv[optind]); - file2 = argv[optind+1]; - + if (strrchr(argv[optind], '@') != NULL) { + userhost = xstrdup(argv[optind]); + file2 = argv[optind + 1]; + } + else { + tflag = 1; + userhost = xstrdup(argv[optind + 1]); + file2 = argv[optind]; + if ((fd = open(file2, O_RDONLY | O_NONBLOCK, 0)) 0) { + fprintf(stderr, \n%s\n,strerror(errno)); + _exit(1); + } + if (getcwd(path, sizeof(path)) != NULL + file2[0] != '/') + file2 = path_append(path, file2); + } if ((host = strrchr(userhost, '@')) == NULL) host = userhost; else { @@ -2219,9 +2243,10 @@ main(int argc, char **argv) else fprintf(stderr, Attached to %s.\n, sftp_direct); } - - err = interactive_loop(conn, file1, file2); - + if (tflag == 0) + err = interactive_loop(conn, file1, file2, 0); + else + err = interactive_loop(conn, file2, file1, 1); close(in); close(out); if (batchmode) -- `` Real men run current !''
Re: sftp upload diff similar to scp
On 2011/09/19 16:29, Christiano F. Haesbaert wrote: Not sure if I got this, but why not using scp then ? You might need to use the sftp protocol rather than scp with some servers. On 19 September 2011 14:52, elitter.net logana...@elitter.net wrote: It's annoying to upload using interactive mode. This diff works like scp. sftp localfile user@host:dir I think this should probably to go the openssh bugzilla.