我想在脚本中使用SSH,但是这个脚本不会在我的机器上执行。在我的实现中有两个限制。
SSH
expect
public keys
可能的选项-解决方案是什么?如何在不添加额外依赖项的情况下,以自动化和安全的方式向ssh提供所请求的密码?是否可以在脚本中提供密码?提前感谢大家:)
bjg7j2ky1#
安装sshpass,然后启动命令:
sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no yourusername@hostname
字符串
wnrlj8wa2#
出于安全原因,您必须避免在命令行上提供密码,否则任何运行ps命令的人都可以看到您的密码。最好像这样使用sshpass实用程序:
#!/bin/bash export SSHPASS="your-password" sshpass -e ssh -oBatchMode=no sshUser@remoteHost
字符串您可能对**How to run the sftp command with a password from Bash script?**感兴趣
mf98qq943#
首先要说明的是:**不要把秘密放在明文中 * 除非 * 你知道为什么这样做是安全的(即您已经评估了知道该秘密的攻击者可能造成的损害)。如果你可以在脚本中加入secret,你可以附带一个ssh密钥,并在ssh-agent shell中执行:
ssh-agent
#!/usr/bin/env ssh-agent /usr/bin/env bash KEYFILE=`mktemp` cat << EOF > ${KEYFILE} -----BEGIN RSA PRIVATE KEY----- [.......] EOF ssh-add ${KEYFILE} # do your ssh things here... # Remove the key file. rm -f ${KEYFILE}
字符串使用ssh密钥的一个好处是,您可以轻松地使用forced commands来限制密钥持有者可以在服务器上执行的操作。一种更安全的方法是让脚本运行ssh-keygen -f ~/.ssh/my-script-key来创建专用于此目的的私钥,但是还需要一个例程来将公钥添加到服务器。
ssh-keygen -f ~/.ssh/my-script-key
wqnecbli4#
AFAIK有没有可能除了使用键或期望,如果你使用的是命令行版本ssh。但是大多数编程语言都有库绑定,如C,Python,PHP,...你可以用这种语言写一个程序。这样就可以自动传递密码。但注意这当然是一个安全问题,因为密码将以纯文本形式存储在该程序中
ssh
uz75evzq5#
我完全同意每个人说这几乎肯定是一个非常糟糕的主意。但是,如果您已经评估了您的需求并想知道如何完成,当然可以不使用密钥,也不安装任何其他程序,只需使用Bourne Shell机制。
在评估安全危害后使用,风险自负
编写一个输出密码的程序/path/to/saypass,比如这个最小脚本:
/path/to/saypass
#!/bin/sh echo 'secret'
字符串使其可执行
chmod +x /path/to/saypass
型这是主命令:
SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [farcommand]
型简而言之,它以一种特殊的方式运行ssh,使用saypass程序来获取密码。(/path/to必须替换为脚本的路径; anything可以是这个字符串;将username@hostname替换为您的详细信息。)详细内容:
saypass
/path/to
anything
username@hostname
SSH_ASKPASS
DISPLAY
setsid
hostname
farcommand
我通常使用date或hostname测试可选的farcommand。有很多地方会出问题。
date
这里的技巧是,标准的Linux命令行ssh有几个环境变量,您可以使用它们来选择一个程序,该程序将被执行以提供密码。这是为X11用户界面设计的,但也可以用于我们的目的。ssh(1)手册页说:SSH_ASKPASS如果ssh需要一个密码,如果它是从终端运行的,它将从当前终端读取密码。如果ssh没有关联的终端,但设置了DISPLAY和SSH_ASKPASS,它将执行SSH_ASKPASS指定的程序并打开X11窗口读取密码。所以:你需要一个程序(shell脚本或任何其他类型),它将输出密码。然后你需要说服ssh使用它:
ssh(1)
您可以将其放在以下sh命令中:
sh
SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [command]
型ssh将执行以下两个命令之一:
/path/to/saypass "Password:" /path/to/saypass "username@hostname's password:"
型
如果需要指纹,在通常情况下会看到信息的地方
The authenticity of host '*hostname* (*ipaddress*)' can't be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no)?
型然后ssh将像这样运行命令:
/path/to/saypass "Please type 'yes' or 'no':"
下面是一个用于在主脚本中创建、使用和删除saypass的脚本。每个人都会告诉你不要把明文密码放在文件中,而且永远不要硬编码密码。他们告诉你这是有原因的:会给你带来很多麻烦。使用风险自担。
#!/bin/sh echo "#!/bin/sh\necho 'secret';rm -f /tmp/saypass.$$" > /tmp/saypass.$$ chmod 775 /tmp/saypass.$$ SSH_ASKPASS="/tmp/saypass.$$" DISPLAY=anything setsid ssh "$@"
这也适用于scp,ssh之上的复制程序:
scp
SSH_ASKPASS=/path/to/saypas DISPLAY=anything setsid scp username@hostname:/path/to/farfile .
真的不要使用这个,除非在可怕的,可怕的情况下,比如你有数百台计算机,你不能安装任何东西,如ssh密钥,sshpass甚至expect。如果你必须使用这种技术,把你的密码放在一个文件中,让saypass从那里得到它。使saypass尽可能安全;你可以通过环境向它传递信息。我不知道手册页上关于“打开一个X11窗口”是什么意思,在我的测试中没有发生过这样的事情。测试日期
sshpass
5条答案
按热度按时间bjg7j2ky1#
安装sshpass,然后启动命令:
字符串
wnrlj8wa2#
出于安全原因,您必须避免在命令行上提供密码,否则任何运行ps命令的人都可以看到您的密码。最好像这样使用sshpass实用程序:
字符串
您可能对**How to run the sftp command with a password from Bash script?**感兴趣
mf98qq943#
首先要说明的是:**不要把秘密放在明文中 * 除非 * 你知道为什么这样做是安全的(即您已经评估了知道该秘密的攻击者可能造成的损害)。
如果你可以在脚本中加入secret,你可以附带一个ssh密钥,并在
ssh-agent
shell中执行:字符串
使用ssh密钥的一个好处是,您可以轻松地使用forced commands来限制密钥持有者可以在服务器上执行的操作。
一种更安全的方法是让脚本运行
ssh-keygen -f ~/.ssh/my-script-key
来创建专用于此目的的私钥,但是还需要一个例程来将公钥添加到服务器。wqnecbli4#
AFAIK有没有可能除了使用键或期望,如果你使用的是命令行版本
ssh
。但是大多数编程语言都有库绑定,如C,Python,PHP,...你可以用这种语言写一个程序。这样就可以自动传递密码。但注意这当然是一个安全问题,因为密码将以纯文本形式存储在该程序中uz75evzq5#
我完全同意每个人说这几乎肯定是一个非常糟糕的主意。但是,如果您已经评估了您的需求并想知道如何完成,当然可以不使用密钥,也不安装任何其他程序,只需使用Bourne Shell机制。
在评估安全危害后使用,风险自负
回复
编写一个输出密码的程序
/path/to/saypass
,比如这个最小脚本:字符串
使其可执行
型
这是主命令:
型
简而言之,它以一种特殊的方式运行
ssh
,使用saypass
程序来获取密码。(/path/to
必须替换为脚本的路径;anything
可以是这个字符串;将username@hostname
替换为您的详细信息。)详细内容:
SSH_ASKPASS
和DISPLAY
setsid
ssh
而不需要控制终端hostname
saypass
以获取密码farcommand
(如果给定)或交互式shell。我通常使用
date
或hostname
测试可选的farcommand
。有很多地方会出问题。
说明
这里的技巧是,标准的Linux命令行
ssh
有几个环境变量,您可以使用它们来选择一个程序,该程序将被执行以提供密码。这是为X11用户界面设计的,但也可以用于我们的目的。ssh(1)
手册页说:SSH_ASKPASS
如果ssh
需要一个密码,如果它是从终端运行的,它将从当前终端读取密码。如果ssh
没有关联的终端,但设置了DISPLAY
和SSH_ASKPASS
,它将执行SSH_ASKPASS
指定的程序并打开X11窗口读取密码。所以:你需要一个程序(shell脚本或任何其他类型),它将输出密码。然后你需要说服
ssh
使用它:SSH_ASKPASS
设置为/path/to/saypass
DISPLAY
设置为愚蠢的值setsid
所做的)您可以将其放在以下
sh
命令中:型
ssh
将执行以下两个命令之一:型
指纹检测
如果需要指纹,在通常情况下会看到信息的地方
型
然后
ssh
将像这样运行命令:型
一体化脚本
下面是一个用于在主脚本中创建、使用和删除
saypass
的脚本。每个人都会告诉你不要把明文密码放在文件中,而且永远不要硬编码密码。他们告诉你这是有原因的:会给你带来很多麻烦。使用风险自担。型
SCP
这也适用于
scp
,ssh
之上的复制程序:型
注意事项
真的不要使用这个,除非在可怕的,可怕的情况下,比如你有数百台计算机,你不能安装任何东西,如ssh密钥,
sshpass
甚至expect
。如果你必须使用这种技术,把你的密码放在一个文件中,让
saypass
从那里得到它。使saypass
尽可能安全;你可以通过环境向它传递信息。我不知道手册页上关于“打开一个X11窗口”是什么意思,在我的测试中没有发生过这样的事情。
测试日期