我正在创建一个脚本,通过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
命令时不会提示输入密码。
答案 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