From 42cabc14d44b69af1df71f6f1e0ae8ccb66a8287 Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Fri, 1 Aug 2008 18:41:14 +0000 Subject: [PATCH] Added support for --append on SFTP uploads. Unfortunately, OpenSSH doesn't support this so it goes untested. --- CHANGES | 4 ++++ RELEASE-NOTES | 1 + docs/MANUAL | 29 ++++++++++++++++++++++++----- docs/curl.1 | 3 ++- lib/ssh.c | 19 ++++++++++++++----- src/main.c | 2 +- 6 files changed, 46 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 96aa267..0cb007f 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,10 @@ Changelog +Daniel Fandrich (1 Aug 2008) +- Added support for --append on SFTP uploads. Unfortunately, OpenSSH doesn't + support this so it goes untested. + Yang Tse (1 Aug 2008) - Configure process now checks if the preprocessor _REENTRANT symbol is already defined. If it isn't currently defined a set of checks are performed to test diff --git a/RELEASE-NOTES b/RELEASE-NOTES index a0ddeaf..5848481 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -20,6 +20,7 @@ This release includes the following changes: o Added test selection by key word in runtests.pl o the curl tool's -w option support the %{ssl_verify_result} variable o Added CURLOPT_SCOPE and scope parsing of the URL according to RFC4007 + o Support --append on SFTP uploads (not with OpenSSH, though) This release includes the following bugfixes: diff --git a/docs/MANUAL b/docs/MANUAL index 3b1195c..3aea5d4 100644 --- a/docs/MANUAL +++ b/docs/MANUAL @@ -48,6 +48,9 @@ SIMPLE USAGE curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \ scp://shell.example.com/~/personal.txt + Get the main page from an IPv6 web server: + + curl -g "http://[2001:1890:1112:1::20]/" DOWNLOAD TO A FILE @@ -86,6 +89,13 @@ USING PASSWORDS standards while the recommended "explicit" way is done by using FTP:// and the --ftp-ssl option. + SFTP / SCP + + This is similar to FTP, but you can specify a private key to use instead of + a password. Note that the private key may itself be protected by a password + that is unrelated to the login password of the remote system. If you + provide a private key file you must also provide a public key file. + HTTP Curl also supports user and password in HTTP URLs, thus you can pick a file @@ -154,9 +164,9 @@ RANGES UPLOADING - FTP + FTP / FTPS / SFTP / SCP - Upload all data on stdin to a specified ftp site: + Upload all data on stdin to a specified server: curl -T - ftp://ftp.upload.com/myfile @@ -169,7 +179,7 @@ UPLOADING curl -T uploadfile -u user:passwd ftp://ftp.upload.com/ - Upload a local file to get appended to the remote file using ftp: + Upload a local file to get appended to the remote file: curl -T localfile -a ftp://ftp.upload.com/remotefile @@ -331,7 +341,7 @@ REFERRER curl -e www.coolsite.com http://www.showme.com/ - NOTE: The referer field is defined in the HTTP spec to be a full URL. + NOTE: The Referer: [sic] field is defined in the HTTP spec to be a full URL. USER AGENT @@ -564,6 +574,14 @@ FTP and PATH NAMES (I.e with an extra slash in front of the file name.) +SFTP and SCP and PATH NAMES + + With sftp: and scp: URLs, the path name given is the absolute name on the + server. To access a file relative to the remote user's home directory, + prefix the file with /~/ , such as: + + curl -u $USER sftp://home.example.com/~/.bashrc + FTP and firewalls The FTP protocol requires one of the involved parties to open a second @@ -875,7 +893,8 @@ MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE As is mentioned above, you can download multiple files with one command line by simply adding more URLs. If you want those to get saved to a local file instead of just printed to stdout, you need to add one save option for each - URL you specify. Note that this also goes for the -O option. + URL you specify. Note that this also goes for the -O option (but not + --remote-name-all). For example: get two files and use -O for the first and a custom file name for the second: diff --git a/docs/curl.1 b/docs/curl.1 index a87e1cc..a23f156 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -106,8 +106,9 @@ the --option version of them. (This concept with --no options was added in 7.19.0. Previously most options were toggled on/off on repeated use of the same command line option.) .IP "-a/--append" -(FTP) When used in an FTP upload, this will tell curl to append to the target +(FTP/SFTP) When used in an upload, this will tell curl to append to the target file instead of overwriting it. If the file doesn't exist, it will be created. +Note that this flag is ignored by some SSH servers (including OpenSSH). .IP "-A/--user-agent " (HTTP) Specify the User-Agent string to send to the HTTP server. Some badly done CGIs fail if this field isn't set to "Mozilla/4.0". To encode blanks in diff --git a/lib/ssh.c b/lib/ssh.c index cb6e96c..ce6f4f0 100644 --- a/lib/ssh.c +++ b/lib/ssh.c @@ -1198,6 +1198,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) break; case SSH_SFTP_UPLOAD_INIT: + { + unsigned long flags; /* * NOTE!!! libssh2 requires that the destination path is a full path * that includes the destination file and name OR ends in a "/" @@ -1221,13 +1223,19 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) } } + if(data->set.ftp_append) + /* Try to open for append, but create if nonexisting */ + flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_APPEND; + else if (data->state.resume_from > 0) + /* If we have restart position then open for append */ + flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_APPEND; + else + /* Clear file before writing (normal behaviour) */ + flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC; + sshc->sftp_handle = libssh2_sftp_open(sshc->sftp_session, sftp_scp->path, - /* If we have restart position then open for append */ - (data->state.resume_from > 0)? - LIBSSH2_FXF_WRITE|LIBSSH2_FXF_APPEND: - LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - data->set.new_file_perms); + flags, data->set.new_file_perms); if(!sshc->sftp_handle) { if(libssh2_session_last_errno(sshc->ssh_session) == @@ -1322,6 +1330,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) state(conn, SSH_STOP); } break; + } case SSH_SFTP_CREATE_DIRS_INIT: if(strlen(sftp_scp->path) > 1) { diff --git a/src/main.c b/src/main.c index eea21a2..ceee05b 100644 --- a/src/main.c +++ b/src/main.c @@ -651,7 +651,7 @@ static void help(void) "Usage: curl [options...] ", "Options: (H) means HTTP/HTTPS only, (F) means FTP only", " --anyauth Pick \"any\" authentication method (H)", - " -a/--append Append to target file when uploading (F)", + " -a/--append Append to target file when uploading (F/SFTP)", " --basic Use HTTP Basic Authentication (H)", " --cacert CA certificate to verify peer against (SSL)", " --capath CA directory to verify peer against (SSL)", -- 2.7.4