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

cle*_*oux 8 linux ssh bash 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
Run Code Online (Sandbox Code Playgroud)

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

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

Wri*_*ken 13

ssh user@host 'cat - > /tmp/file.ext; do_something_with /tmp/file.ext;rm /tmp/file.ext' < file.ext 
Run Code Online (Sandbox Code Playgroud)

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

在〜/ .ssh/config中:

Host *
        ControlMaster auto
        ControlPath ~/.ssh/sockets/ssh-socket-%r-%h-%p
Run Code Online (Sandbox Code Playgroud)

.

$ ssh -f -N -l user host
(socket is now open)
Run Code Online (Sandbox Code Playgroud)

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