Giter Site home page Giter Site logo

upa / mscp Goto Github PK

View Code? Open in Web Editor NEW
111.0 6.0 9.0 489 KB

mscp: transfer files over multiple SSH (SFTP) connections

License: GNU General Public License v3.0

CMake 5.48% C 71.43% Python 16.22% Shell 1.36% Dockerfile 5.51%
c file-transfer ssh sftp scp mscp

mscp's Introduction

mscp: multi-threaded scp

build on ubuntu build on macOS build on FreeBSD test

mscp, a variant of scp, copies files over multiple SSH (SFTP) connections by multiple threads. It enables transferring (1) multiple files simultaneously and (2) a large file in parallel, reducing the transfer time for a lot of/large files over networks.

You can use mscp like scp, for example:

$ mscp srcfile [email protected]:dstfile

Remote hosts only need to run standard sshd supporting the SFTP subsystem (e.g. openssh-server), and you need to be able to ssh to the hosts as usual. mscp does not require anything else.

mscp-demo.mp4

Major differences from scp on usage:

  • Remote-to-remote copy is not supported.
  • -r option is not needed to transfer directories.
  • Checkpointing for resuming failed transfer is supported.
  • and any other differences I have not implemented and noticed.

Paper:

  • Ryo Nakamura and Yohei Kuga. 2023. Multi-threaded scp: Easy and Fast File Transfer over SSH. In Practice and Experience in Advanced Research Computing (PEARC '23). Association for Computing Machinery, New York, NY, USA, 320โ€“323. https://doi.org/10.1145/3569951.3597582

Install

  • macOS
# Homebrew
brew install upa/tap/mscp

# MacPorts
sudo port install mscp
  • Ubuntu
sudo add-apt-repository ppa:upaa/mscp
sudo apt-get install mscp
  • RHEL-based distributions
sudo dnf copr enable upaaa/mscp
sudo dnf install mscp
  • Single binary mscp for x86_64 (not optimal performance)
wget https://github.com/upa/mscp/releases/latest/download/mscp.linux.x86_64.static -O /usr/local/bin/mscp
chmod 755 /usr/local/bin/mscp

Build

mscp depends on a patched libssh. The patch introduces asynchronous SFTP Write, which is derived from https://github.com/limes-datentechnik-gmbh/libssh (see Re: SFTP Write async).

We test building mscp on Linux (Ubuntu, Rocky, Alma, and Alpine), macOS, and FreeBSD.

# clone this repository
git clone https://github.com/upa/mscp.git
cd mscp

# prepare patched libssh
git submodule update --init
patch -d libssh -p1 < patch/$(git --git-dir=./libssh/.git describe).patch

# install build dependency
bash ./scripts/install-build-deps.sh

# configure mscp
mkdir build && cd build
cmake ..

# in macOS, you may need OPENSSL_ROOT_DIR for cmake:
# cmake .. -DOPENSSL_ROOT_DIR=$(brew --prefix)/opt/[email protected]

# build
make

# install the mscp binary to CMAKE_INSTALL_PREFIX/bin (usually /usr/local/bin)
make install

Source tar balls (mscp-X.X.X.tar.gz, not Source code) in Releases page contain the patched version of libssh. So you can start from cmake with it.

Documentation

manpage is available.

mscp's People

Contributors

upa avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mscp's Issues

Hpn-ssh?

Hey there, a colleague saw your presentation at PEARC and sent me a link. Have you looked at hpn-ssh in terms of mscp? If not please take a look GitHub.com/rapier1/openssh-portable. I'd be interested in talking to you if you like.

CLI documentation / usability / default values

Just a few minor things concerning the CLI help and some usability / default value stuff. More like a collection of things here.

Concerning the help:

  • -n has default floor(log(cores)*2)+1, but is that log10 or log2?
  • -s says it has default 64M, but as a user I cannot give mscp the number with units - I have to specify bytes. I'd like to be able to put something like -s 4M myself.
  • What are the allowed values for -g, -c, -M?

Concerning usability:

  • When the values for -s and -S are not divisible by 4096, mscp will give an error and exit. Can't it just round to the next allowed value?
  • Just a minor thing, but why does mscp not create the directory needed for -W itself?
  • Also, it would be great if I could just specify a flag and mscp would take care of the checkpoints automatically (maybe by making a properly named temporary folder? unison does just that. I don't know if the rsync way (--partial --append-verify) would work for mscp too. Browsers like chrome just leave unfinished downloads as they are, but they get an extension that signals incompleteness (.crdownload). What I like about all those ideas is that they happen automatically, increasing user friendlyness).
  • This might be an oversight on my side, but I specified my login name as user@host. What is -l for?

Concercing the default values:

  • MAX_CHUNK_SIZE is very large. For a file of hundreds of gigabytes, the transfer is not really interruptible with such a large chunk size (it would have to start over). The minimum chunk size is also relatively large. Wouldn't 16MB/32MB be more reasonable? I'm getting good performance with those and have a quite interruptible transmission.
  • Also, for my use case (a high-bandwidth high-latency connection), the number of connections is much more important that the number of ssh connections. In fact, I get full saturation with just -u 1 (but -n 12). The other way round (-u 12 -n 1), I get just plain rsync/scp performance which is horribly slow. The default values however seem to prefer high ssh connection count but low connection count. That does not really cater to the intended audience.

All in all, thank you for your software that makes my transfers fast again. I like it a lot despite the flood of tickets I reported.

Add support to limit bandwidth

Hello,

I would like to run multiple mscp concurrently and control the bandwith limit on each transfer started. mscp is too fast for some links and use case.

Similar to rsync --bwlimit or scp -l

Thanks
Bruno

Prebuilt binary has very very very poor performance

Nice project, I was going to write something like this, on this weekend (I already have a script to copy a lot of files in parallel, but also needed one to send one big file in parallel, due to network scaling to 25Gbps+), but then did a quick google search and found the PERC papers quickly.

Tested, and it is not too good:

mscp v0.2.1

$ ~/mscp.linux.x86_64.static /tmp/usr-share.tar localhost:/tmp/usr-share.tar2
Password: 
[=========>                                                  ]  19%  2.9GB/14.6GB  282.4MB/s

$ rm -f /tmp/usr-share.tar2

$ ~/mscp.linux.x86_64.static -v /tmp/usr-share.tar localhost:/tmp/usr-share.tar2
bitrate limit: 0 bps
Password: 
thread[0]: connecting to localhost
thread[1]: connecting to localhost
thread[2]: connecting to localhost
thread[3]: connecting to localhost
thread[4]: connecting to localhost
thread[5]: connecting to localhost
thread[6]: connecting to localhost
[=====================================>          ]  83% 12.1GB/14.6GB  313.5MB/s

Using just normal scp over localhost (IPv4) I am getting about 430MB/s (scp sending, sshd receiving), or 413MB/s (ssh sending, scp receiving).

All files on tmpfs in memory.

Does not look like a bottlneck on sshd side:
image

Same results with forcing -o [email protected], ca. 300MB/s.

AMD Threadripper 2950X (Zen+), 16 core (32 threads) CPU, ca. 3.2-4.2GHz

OpenSSH 1:9.6p1-3

OpenSSL 3.2.1-3

Netcat loopback over ::1 (/dev/zero |nc; nc>/dev/null), 1.1GB/s

iperf3 over single tcp on ::1, 22-39 Gbps (without and with -Z option)

Then tested, deb 0.2.1-1~noble, for Ubuntu, and got 2.3GB/s easily with default 7 threads, and about 2.8GB/s with manual -n 10 (could do more to a remote system, but that is above 25Gbps already, and the other machine with 100Gbps NIC on my network is currently offline).

So, the issue clearly looks to be the problem with prebuilt binary. Yes, there is a warning in the readme, but I was not expecting 10ร— worse performance.

Possibility to provide password through sshpass

Hi, Thanks for writing this software. I performed an initial speed test and it provides an impressive increase versus scp and our normal parallel/rsync solution. For some of our transfers however, we require a user/passwd combination. Therefore we use sshpass. Unfortunately, this did not seem to work. Is it possible to provide the passwd through sshpass?

In the meantime, I tried some other tools and I noticed https://github.com/clarkwang/passh, can provide the passwd but sshpass still fails.

Static build will not resolve localhost

(deck@steamdeck 3DLiveScanner)$ ~/Downloads/Packages/mscp.linux.x86_64.static -P 8022 parker@localhost:/sdcard/Documents/ .
mscp_connect: [ssh.c:185:ssh_init_session] failed to connect ssh server: Connection refused
(255)(deck@steamdeck 3DLiveScanner)$ ssh -p 8022 parker@localhost
parker@localhost's password: 
Welcome to Termux!

I changed over to 127.0.0.1 and it worked.

Proxyjump

Hi,

Thx for your great work! Does mscp support proxyjump? For example: scp -r -P 2222 -J user1@addr user2@addr:path path

Thx!

Issue with resume transfer

Hi,

I encountered this when I tried to resume the transfer: "mscp_checkpoint_load: [checkpoint.c:366:checkpoint_load_chunk] path index 583 not found". Can u help me with this?

Thx!

Unable to parse IPv6 addresses

Example usage :

mscp -n 48 test.zip root@[24X2:1fX0:8X00:4Xd::3:0]:/home/ returns the error :
mscp_connect: ssh.c:167:ssh_init_session: failed to connect ssh server: Failed to resolve hostname [2402 (Name does not resolve)

Whereas, the implementation of scp works on the square brackets.

copy fails when the destination path has suffix '/' but does not exist

  1. When a destination directory dst is empty, copy a file test as a different name asdf under the directory dst works.
ryzen1 ~/w/m/build > ./mscp test localhost:dst/asdf
[=============================================] 100% 1024.0KB/1.0MB    8.3MB/s  00:00 
  1. When a destination directory dst is empty, copy a file test as a different name asdf/ under the directory dst fails: mscp created a directory dst/asdf and then exited with the error:
ryzen1 ~/w/m/build > ./mscp test localhost:dst/asdf/
thread[0]: copy failed: test -> dst/asdf/, 0x0000000000-0x0000100000, [path.c:311:touch_dst_path] mscp_open dst/asdf/: Transport endpoint is not connected
[                                               ]   0%  0.0B /1.0MB    0.0B/s   --:-- ETA

2.1. After that, copy the file test with the same destination path dst/asdf/ works: test is coppied as dst/asdf/test (because the directory dst/asdf/ already exists):

ryzen1 ~/w/m/build > ./mscp test localhost:dst/asdf/
[=============================================] 100% 1024.0KB/1.0MB    8.6MB/s  00:00    

ryzen1 ~/w/m/build > ls ~/dst/asdf                                        0.386s dev 16:24
test

The expected behavior is that when the destination path is dst/asdf/ on the case 2, mscp should create the directory dst/asdf and copy test to dst/asdf/test.

support for zstd compression

According to the CLI help, currently only zlib compression is supported. There are a multitude of impressive benchmark that show the power and efficiency of zstd over zlib. Acknowledging that mscp is meant for slow/high-latency connections anyway, it would surely benefit from more powerful compression.

A different idea would be to support reading from stdin. Then, the user is free to transparently compress the file on their own.

unable to transfer file between RHEL 7 and ubuntu using mscp

I am trying to transfer file between RHEL 7.9 and Ubuntu 22.04. I am able to transfer file using scp. But when I am using mscp I am getting error message as below
Copy failed: sftp_async_write: sftp_async_write: Out of memory or Permission denied

Please let me know what are the steps required to fix it.

No match for method server host key algo

When trying to connect to an embedded device running dropbear sshd, I get a host key algo error.

Here is my ssh config file at ~/.ssh/config

Host satellite-payload1
    HostName 192.168.102.3
    User root
    IdentityFile ~/.ssh/petalinux_dev
    KexAlgorithms +ssh-rsa
    HostKeyAlgorithms +ssh-rsa

Expected behavior:

mscp should respect the ssh config file and use the additional hostkey and kex algorithms and connect.

Actual behavior:

Fails to negotiate ssh algos

mscp -F .ssh/config 100MBfile satellite-payload1:/run/media/mmcblk0p1/
mscp_connect: [ssh.c:185:ssh_init_session] failed to connect ssh server: kex error : no match for method server host key algo: server [ssh-rsa], client [ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,[email protected],[email protected],rsa-sha2-512,rsa-sha2-256]

noclobber option

Hi,

Normally we use rsync and one of the advantages it the resume (already mentioned in another issue) option. Another is the option to not overwrite files if they exist. Would it be possible for you to add a --noclobber option to mscp?

Thanks!

I added mscp as new port in macports

Hello,

Just wanted to make you aware that I added mscp to the list of available ports in macports for macos.

So for macos users that want to install mscp using macports instead of brew, it is now available doing sudo port install mscp

Host runs out of memory resulting in mscp being killed

System configuration:

NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

MSCP stack trace:

execve("/usr/local/bin/mscp", ["mscp", "-n", "1", "-i", "test.pem", "/localcache/", "[email protected]:/tmp/stash"], 0x7fffe1f95470 /* 13 vars */) = 0
mmap(NULL, 680, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f901349a000
arch_prctl(ARCH_SET_FS, 0x7f901349a1e0) = 0
set_tid_address(0x6dc2f0)               = 1265
brk(NULL)                               = 0x11ee000
brk(0x11f0000)                          = 0x11f0000
mmap(0x11ee000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x11ee000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013499000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013498000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013497000
pipe([3, 4])                            = 0
mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013493000
fcntl(4, F_GETFL)                       = 0x1 (flags O_WRONLY)
fcntl(4, F_SETFL, O_WRONLY|O_APPEND)    = 0
ioctl(4, TIOCGWINSZ, 0x7ffd178d4828)    = -1 ENOTTY (Inappropriate ioctl for device)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013492000
getuid()                                = 0
open("/etc/passwd", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 5
fcntl(5, F_SETFD, FD_CLOEXEC)           = 0
fcntl(5, F_SETFD, FD_CLOEXEC)           = 0
read(5, "root:x:0:0:root:/root:/bin/bash\n"..., 1024) = 1024
lseek(5, -992, SEEK_CUR)                = 32
close(5)                                = 0
open("/root/.ssh/config", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/etc/ssh/ssh_config", O_RDONLY|O_LARGEFILE) = 5
read(5, "\n# This is the ssh client system"..., 1024) = 1024
open("/etc/ssh/ssh_config.d/*.conf", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
read(5, "#   AddressFamily any\n#   Connec"..., 1024) = 579
read(5, "", 1024)                       = 0
close(5)                                = 0
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 5
fcntl(5, F_SETFL, O_RDONLY|O_NONBLOCK|O_LARGEFILE) = 0
setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
connect(5, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("172.31.1.70")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=5, events=POLLIN|POLLOUT}], 1, 10000) = 1 ([{fd=5, revents=POLLOUT}])
fcntl(5, F_SETFL, O_RDONLY|O_LARGEFILE) = 0
sendto(5, "SSH-2.0-libssh_0.10.4\r\n", 23, MSG_NOSIGNAL, NULL, 0) = 23
poll([{fd=5, events=POLLIN|POLLOUT}], 1, 9999) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, 9999)  = 1 ([{fd=5, revents=POLLIN}])
mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f901348b000
recvfrom(5, "SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ub"..., 4096, 0, NULL, NULL) = 41
getpid()                                = 1265
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f901348a000
getrandom("\xb1\x94\x4d\x01\xc4\x57\x2d\x8f\x46\xd9\x97\x3e\x5e\x6d\x5d\xbf\x94\x2a\xb9\x55\x14\x91\x6f\xb8\xb9\x02\x1d\x2d\xef\xa7\xc8\x6c", 32, 0) = 32
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013489000
open("/root/.ssh/known_hosts", O_RDONLY|O_LARGEFILE) = 6
read(6, "172.31.1.70 ssh-ed25519 AAAAC3Nz"..., 1024) = 93
read(6, "", 1024)                       = 0
close(6)                                = 0
open("/etc/ssh/ssh_known_hosts", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013488000
sendto(5, "\0\0\3T\7\24L3\24\272[{\237w\224i]\215\5\364\216\33\0\0\0\361curve2"..., 856, MSG_NOSIGNAL, NULL, 0) = 856
poll([{fd=5, events=POLLIN|POLLOUT}], 1, 9982) = 1 ([{fd=5, revents=POLLIN|POLLOUT}])
recvfrom(5, "\0\0\4\34\n\24>\3310\377\2745\313\354\272+\217\261\270\316\35\246\0\0\0\346curve2"..., 4096, 0, NULL, NULL) = 1056
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013486000
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "\0\0\0,\6\36\0\0\0 \35\1\354\213\16deA-og\240D(\375T\307\274\311\210\350\207"..., 48, MSG_NOSIGNAL, NULL, 0) = 48
poll([{fd=5, events=POLLIN|POLLOUT}], 1, 9978) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, 9977)  = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\0\0\0\274\10\37\0\0\0003\0\0\0\vssh-ed25519\0\0\0 \372i\367"..., 4096, 0, NULL, NULL) = 436
sendto(5, "\0\0\0\f\n\25\0\0\0\0\0\0\0\0\0\0", 16, MSG_NOSIGNAL, NULL, 0) = 16
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
munmap(0x7f9013485000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013485000
getpid()                                = 1265
getpid()                                = 1265
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
sendto(5, "#\f(\277\23\23J\25^%\277\212\331)M\5\361{\312\311\31\6*Mg]\300\211\251\230^\230"..., 44, MSG_NOSIGNAL, NULL, 0) = 44
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLIN|POLLOUT}])
recvfrom(5, "\300~\315(\341i\257\250\v\253\215cO[K\2200\345kZ\210:8\371/\305\263\tGMN<"..., 4096, 0, NULL, NULL) = 44
getpid()                                = 1265
getpid()                                = 1265
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013484000
munmap(0x7f9013484000, 4096)            = 0
sendto(5, "\325\202v\257,i \303\346\240v\25\336\363\n\245A\347\r85\345\257$\205\204\320\21)\344\277\246"..., 68, MSG_NOSIGNAL, NULL, 0) = 68
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "hn\17\246\213>\342Hcx'\220\315\205\373j(\314r$\216g\346_\212\377!\308\317/a"..., 4096, 0, NULL, NULL) = 44
open("test.pem.pub", O_RDONLY|O_LARGEFILE) = 6
fstat(6, {st_mode=S_IFREG|0664, st_size=404, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013484000
readv(6, [{iov_base="ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB"..., iov_len=403}, {iov_base="\n", iov_len=1024}], 2) = 404
close(6)                                = 0
getpid()                                = 1265
getpid()                                = 1265
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013483000
munmap(0x7f9013483000, 4096)            = 0
sendto(5, "\n\332\313i|\216g\317\17\222\250\231\354\305RHO\350:8\264\312F\376\351.\320e\313\253%\336"..., 372, MSG_NOSIGNAL, NULL, 0) = 372
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\321\264\262\273B\36o\377\343\263\206\211\207\314Z\341\200\\\3308\251r\212\313E\10v\206\354\245\10\200"..., 4096, 0, NULL, NULL) = 332
open("test.pem", O_RDONLY|O_LARGEFILE)  = 6
fstat(6, {st_mode=S_IFREG|0600, st_size=1679, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013483000
readv(6, [{iov_base="-----BEGIN RSA PRIVATE KEY-----\n"..., iov_len=1678}, {iov_base="\n", iov_len=1024}], 2) = 1679
close(6)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013482000
munmap(0x7f9013482000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013482000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013480000
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "#*\234?Q\377\206<\347\16`\346]\256Q\3143\247\202L\306]\315(M\3731\224\261#\362+"..., 652, MSG_NOSIGNAL, NULL, 0) = 652
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\253Yf\34\211\204\273\240\6\rW\2719\311\275\277\337\323\203\345q\23\340^\372\1w@", 4096, 0, NULL, NULL) = 28
open("/root/.ssh/known_hosts", O_RDONLY|O_LARGEFILE) = 6
read(6, "172.31.1.70 ssh-ed25519 AAAAC3Nz"..., 1024) = 93
read(6, "", 1024)                       = 0
close(6)                                = 0
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "^\236{Ji;>\323Ztc\246\215\225\27\240\300]X\247k\265\267\5\253\242\315\371\364\255\3074"..., 52, MSG_NOSIGNAL, NULL, 0) = 52
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\266\311\316\30iJ^!Q0Ci}\211\366\"J\247y\254\204\264;3\357\r\27\252\236Zm0"..., 4096, 0, NULL, NULL) = 776
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "L\"\214\250m\346\34\331\232\373Ts\264\6?\v\367\177w\363\377)\233\340Z\364\376\370\2006\3544"..., 36, MSG_NOSIGNAL, NULL, 0) = 36
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "\353\225p\367\317\327\250\371w\340}\266G\300\222\6h|8,~\313-\270`-\341Ki=I\0"..., 4096, 0, NULL, NULL) = 192
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "1o\263\244\356\36\376\275\336\363\36\326\2\232\317\301\177\374\305z\276\22Xgg\376\256k\323m \373"..., 52, MSG_NOSIGNAL, NULL, 0) = 52
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "Q\340\340\363\303#\364:~\213\216\222A\23vUUl-\16g_\231\333\23^\25\t%\210\21\204"..., 4096, 0, NULL, NULL) = 72
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "`\37~Y\326\313\252\\{7\200\327\1\344\223\215\312p\"\256\365\5\321K\216\335ve\362S#\4"..., 44, MSG_NOSIGNAL, NULL, 0) = 44
poll([{fd=5, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=5, revents=POLLOUT}])
poll([{fd=5, events=POLLIN}], 1, -1)    = 1 ([{fd=5, revents=POLLIN}])
recvfrom(5, "&]>\356.1@\305\320\335\313\23\355\204\255\356%Ny\345$yTq\340\200\256 P\335\325W"..., 4096, 0, NULL, NULL) = 220
getpid()                                = 1265
getpid()                                = 1265
sendto(5, "\232F\375\361k\274u\265\223\256\275*\17\267&\231%\270\333\323;\rKy\367\206%\fC\373\360B"..., 36, MSG_NOSIGNAL, NULL, 0) = 36
rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f901345d000
mprotect(0x7f901345f000, 135168, PROT_READ|PROT_WRITE) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
clone(child_stack=0x7f901347f928, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[1287], tls=0x7f901347fb30, child_tidptr=0x6dc2f0) = 1287
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
nanosleep({tv_sec=0, tv_nsec=100000}, 0x7ffd178d4880) = 0
mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f901343a000
mprotect(0x7f901343c000, 135168, PROT_READ|PROT_WRITE) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
clone(child_stack=0x7f901345c928, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[1288], tls=0x7f901345cb30, child_tidptr=0x6dc2f0) = 1288
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x402a40, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x5ea1ae}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9013417000
mprotect(0x7f9013419000, 135168, PROT_READ|PROT_WRITE) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
clone(child_stack=0x7f9013439928, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[1289], tls=0x7f9013439b30, child_tidptr=0x6dc2f0) = 1289
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
futex(0x7f901347fb68, FUTEX_WAIT_PRIVATE, 2, NULL) = ?
+++ killed by SIGKILL +++

Password needs to entered multiple times when resuming from a transfer

Hello,

I know that this issue can be mitigated easily by key-based authentication and an ssh-agent.
Still, I found the following inconsistency: For an initial transfer, I only need to provide my password once. For continuing a transfer (with -W), mscp asks for my password for each connection separately.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.