如何在Shell脚本中创建scp问我密码

时间:2016-12-08 09:10:34

标签: linux shell ssh scp csh

我正在创建一个脚本,通过scp在我的两台计算机之间安全地传输数据。

但是在脚本中,由于没有密码,它显示错误。那么如何在执行scp命令后让我的shell脚本向我询问密码?

这是我的csh脚本。

# ssh shahk@sj-shahk
# ls -al
echo "Source Location of Remote Server - $1"
echo "Destination Location of Local Server - $2"
echo "File/Folder to be Transferred from Remote Server - $3"

echo "File Transfer Starts"
scp -rv $1/$3 <username>@<hostname>:$2
echo "File Transfer Completed"

# exit

现在我以下列方式使用上面的脚本ssh

ssh <username>@<hostname> "<script name> <args>"

当我以上述方式使用时,执行scp命令时不会提示输入密码。

2 个答案:

答案 0 :(得分:1)

如其他答案所述,sshpass将完美地完成工作。如果您无法在本地计算机上安装新软件包,您还可以使用expect(默认情况下安装在大多数发行版上)来自动化您的交互式会话。

expect的基本语法是等待程序显示特定的字符串(expect mystring),这会触发特定的行为(send command

以下脚本显示了实现所需内容的基本结构:

#!/usr/bin/expect -f
# syntax to specify which command to monitor
spawn scp myfile user@remote.host:/dest_folder

# this syntax means we expect the spawned program to display "password: "
# expect can understand regex and glob as well. read the man page for more details
expect "password: "

# the \r is needed to submit the command
send "PASSWORD\r"

# expect "$ " means we wait for anything to be written.
# change if you want to handle incorrect passwords
expect "$ "
send "other_command_to_execute_on_remote\r"
expect "$ "
send "exit\r"

作为旁注,您还可以通过ssh密钥设置无密码授权。

#1) create a new ssh key on your local computer
> ssh-keygen -t rsa
#2) copy your public key to your remote server
# you will need to login, but only once. Once the key is on the remote server, you'll be able to connect without password.
> ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip_machine
# OR
> cat ~/.ssh/id_rsa.pub | ssh user@ip_machine "cat - >> ~/.ssh/authorized_keys"

This tutorial说明了如何使用keychain工具管理多个ssh密钥和用户。

答案 1 :(得分:0)

<?php

class workerThread extends Thread {
public function __construct($i){
  $this->i=$i;
}

public function run(){
  while(true){
   echo $this->i;
   sleep(1);
  }
}
}

for($i=0;$i<50;$i++){
$workers[$i]=new workerThread($i);
$workers[$i]->start();
}

ssh <username>@<hostname> "<script name> <args>" 只能从TTY读取密码,在这种情况下它没有TTY。当您运行scp并指定要在远程系统上执行的命令时(正如您在此处所做的那样),默认情况下ssh不会在远程系统上分配PTY(伪tty) 。您的脚本以及从中启动的所有命令(包括ssh)最终都会在没有TTY的情况下运行。

您可以使用ssh scp选项在远程系统上分配tty:

-t

如果您收到类似&#34的消息;由于stdin不是终端&#34;,将不会分配伪终端,然后添加另一个ssh -t <username>@<hostname> "<script name> <args>"

-t