How to pass password to scp?
LinuxScpIo RedirectionLinux Problem Overview
I know it is not recommended, but is it at all possible to pass the user's password to scp?
I'd like to copy a file via scp as part of a batch job and the receiving server does, of course, need a password and, no, I cannot easily change that to key-based authentication.
Linux Solutions
Solution 1 - Linux
Use sshpass:
sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path
or so the password does not show in the bash history
sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path
The above copies contents of path from the remote host to your local.
Install :
- ubuntu/debian
apt install sshpass
- centos/fedora
yum install sshpass
- mac w/ macports
port install sshpass
- mac w/ brew
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
Solution 2 - Linux
just generate a ssh key like:
ssh-keygen -t rsa -C "[email protected]"
copy the content of ~/.ssh/id_rsa.pub
and lastly add it to the remote machines ~/.ssh/authorized_keys
make sure remote machine have the permissions 0700 for ~./ssh folder
and 0600 for ~/.ssh/authorized_keys
Solution 3 - Linux
If you are connecting to the server from Windows, the Putty version of scp ("pscp") lets you pass the password with the -pw
parameter.
Solution 4 - Linux
Solution 5 - Linux
curl can be used as a alternative to scp to copy a file and it supports a password on the commandline.
curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
Solution 6 - Linux
You can use the 'expect' script on unix/terminal
For example create 'test.exp' :
#!/usr/bin/expect
spawn scp /usr/bin/file.txt root@<ServerLocation>:/home
set pass "Your_Password"
expect {
password: {send "$pass\r"; exp_continue}
}
run the script
expect test.exp
I hope that helps.
Solution 7 - Linux
Here is an example of how you do it with expect
tool:
sub copyover {
$scp = Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}/$file");
$scp->expect(30,"ssword: ") || die "Never got password prompt from $dest:$!\n";
print $scp 'password' . "\n";
$scp->expect(30,"-re",'$\s') || die "Never got prompt from parent system:$!\n";
$scp->soft_close();
return;
}
Solution 8 - Linux
You may use ssh-copy-id
to add ssh key:
$which ssh-copy-id #check whether it exists
If exists:
ssh-copy-id "user@remote-system"
Solution 9 - Linux
Nobody mentioned it, but Putty scp (pscp) has a -pw option for password.
Documentation can be found here: https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp
Solution 10 - Linux
Once you set up ssh-keygen
as explained above, you can do
scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/
If you want to lessen typing each time, you can modify your .bash_profile
file and put
alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/
Then from your terminal do source ~/.bash_profile
. Afterwards if you type remote_scp
in your terminal it should run the scp
command without password.
Solution 11 - Linux
- Make sure password authentication is enabled on the target server. If it runs Ubuntu, then open
/etc/ssh/sshd_config
on the server, find linesPasswordAuthentication=no
and comment all them out (put#
at the start of the line), save the file and runsudo systemctl restart ssh
to apply the configuration. If there is no such line then you're done. - Add
-o PreferredAuthentications="password"
to yourscp
command, e.g.:scp -o PreferredAuthentications="password" /path/to/file user@server:/destination/directory
Solution 12 - Linux
Here's a poor man's Linux/Python/Expect-like example based on this blog post: Upgrading simple shells to fully interactive TTYs. I needed this for old machines where I can't install Expect or add modules to Python.
Code:
(
echo 'scp [email protected]:./install.sh .'
sleep 5
echo 'scp-passwd'
sleep 5
echo 'exit'
) |
python -c 'import pty; pty.spawn("/usr/bin/bash")'
Output:
scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password:
install.sh 100% 15KB 236.2KB/s 00:00
bash-4.2$ exit
exit
Solution 13 - Linux
-
make sure you have "expect" tool before, if not, do it
# apt-get install expect
-
create the a script file with following content. (# vi /root/scriptfile)
spawn scp /path_from/file_name user_name_here@to_host_name:/path_to
expect "password:"
send put_password_here\n;
interact
-
execute the script file with "expect" tool
# expect /root/scriptfile
Solution 14 - Linux
copy files from one server to other server ( on scripts)
Install putty on ubuntu or other Linux machines. putty comes with pscp. we can copy files with pscp.
apt-get update
apt-get install putty
echo n | pscp -pw "Password@1234" -r user_name@source_server_IP:/copy_file_path/files /path_to_copy/files
For more options see pscp help.
Solution 15 - Linux
In case if you observe a strict host key check error then use -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
options.
The complete example is as follows
sshpass -p "password" scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]:/tmp/from/psoutput /tmp/to/psoutput
Solution 16 - Linux
One easy way I do this:
Use the same scp cmd as you use with ssh keys i.e
scp -C -i <path_to opens sshkey> <'local file_path'> user@<ip_address_VM>: <'remote file_path’>
for transferring file from local to remote
but instead of providing the correct
Solution 17 - Linux
You can use below steps. This works for me!
Step1- create a normal file suppose "fileWithScpPassword" which contains the ssh password for the destination server.
Step2- use sshpaas -f followed by password file name and then normal scp command.
sshpass -f "fileWithScpPassword" scp /filePathToUpload user@ip:/destinationPath/
Solution 18 - Linux
An alternative would be add the public half of the user's key to the authorized-keys file on the target system. On the system you are initiating the transfer from, you can run an ssh-agent daemon and add the private half of the key to the agent. The batch job can then be configured to use the agent to get the private key, rather than prompting for the key's password.
This should be do-able on either a UNIX/Linux system or on Windows platform using pageant and pscp.
Solution 19 - Linux
All the solutions mentioned above can work only if you the app installed or you should have the admin rights to install except or sshpass.
I found this very useful link to simply start the scp in Background.
$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1
https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/
Solution 20 - Linux
I found this really helpful answer here.
rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/
Not only you can pass there the password, but also it will show the progress bar when copying. Really awesome.