以下是问题的背景:
为了让我能够在工作中打印文档,我必须将文件复制到另一台计算机,然后从该计算机打印。 (不要问。它很复杂,没有其他可行的解决方案。)两台计算机都是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上。
答案 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"