如何scp文件并运行ssh命令只询问一次密码?

时间:2011-06-07 16:47:12

标签: linux bash ssh scp

以下是问题的背景:

为了让我能够在工作中打印文档,我必须将文件复制到另一台计算机,然后从该计算机打印。 (不要问。它很复杂,没有其他可行的解决方案。)两台计算机都是Linux,我在bash中工作。我目前这样做的方法是将scp文件传输到打印计算机,然后ssh输入并从命令行打印。

这就是我想做的事情:

为了让我的生活更轻松,我想将这两个步骤合二为一。我可以轻松编写一个执行这两个步骤的函数,但我必须提供两次密码。有没有办法合并这些步骤,以便我只提供一次密码?

在有人建议之前,基于密钥的ssh-logins不是一个选项。出于安全原因,管理员已对其进行了专门禁用。

解决方案:

我最终做的是对Wrikken提供的第二个解决方案的修改。简单地在功能中完成他的第一个建议就可以完成工作,但我喜欢能够打印多个文档而无需每个文档输入一次密码的想法。我有一个相当长的密码而且我是一个懒惰的打字员:)

所以,我所做的是接受一系列命令并将它们包装在python脚本中。我使用python因为我想参数化脚本,我觉得在python中最容易做到。我作弊,只是从python通过os.system运行bash命令。 Python只处理参数化和流控制。逻辑如下:

if socket does not exist:
    run bash command to create socket with timeout
copy file using the created socket
ssh command to print using socket

除了使用超时之外,我还在我的python脚本中有一个选项,如果我愿意,可以手动关闭套接字。

如果有人想要这些代码,请告诉我,我会粘贴它或将它放在我的git repo上。

2 个答案:

答案 0 :(得分:13)

ssh user@host 'cat - > /tmp/file.ext; do_something_with /tmp/file.ext;rm /tmp/file.ext' < file.ext 

另一种选择是让ssh隧道保持打开状态:

在〜/ .ssh / config:

Host *
        ControlMaster auto
        ControlPath ~/.ssh/sockets/ssh-socket-%r-%h-%p

$ ssh -f -N -l user host
(socket is now open)

后续的ssh / scp请求将重用已存在的隧道。

答案 1 :(得分:0)

这里是@Wrikken's second method之后的bash脚本模板,但可以按原样使用-无需编辑用户的SSH配置文件:

#!/bin/bash

TARGET_ADDRESS=$1 # the first script argument
HOST_PATH=$2 # the second script argument
TARGET_USER=root
TMP_DIR=$(mktemp -d)
SSH_CFG=$TMP_DIR/ssh-cfg
SSH_SOCKET=$TMP_DIR/ssh-socket
TARGET_PATH=/tmp/file

# Create a temporary SSH config file:
cat > "$SSH_CFG" <<ENDCFG
Host *
        ControlMaster auto
        ControlPath $SSH_SOCKET
ENDCFG

# Open a SSH tunnel:
ssh -F "$SSH_CFG" -f -N -l $TARGET_USER $TARGET_ADDRESS

# Upload the file:
scp -F "$SSH_CFG" "$HOST_PATH" $TARGET_USER@$TARGET_ADDRESS:"$TARGET_PATH"

# Run SSH commands:
ssh -F "$SSH_CFG" $TARGET_USER@$TARGET_ADDRESS -T <<ENDSSH
# Do something with $TARGET_PATH here
ENDSSH

# Close the SSH tunnel:
ssh -F "$SSH_CFG" -S "$SSH_SOCKET" -O exit "$TARGET_ADDRESS"