我想做这样的事情:
scp local_file remote_server:/some_directory
但是为了获得 /some_directory 的权限,我们需要调用sudo
。我知道类似的问题在这里已经被问过好几次了,但大多数答案要么利用了sudo
密码缓存(出于某种原因,在连续两次调用中似乎对我不起作用ssh
),要么利用了我们是 root 的事实(所以我们可以设置无密码sudo
或让 SSH 让 root 进入)。
在后者中,这两种解决方案似乎都不安全,所以我宁愿假设我们没有要求sudo
成为 root,因此无法重新配置系统。在这种情况下可以做什么来简单地复制文件呢?
到目前为止,我的尝试如下:
(
read -s -p 'Enter password: ' pass;
echo $pass ;
tar cf - local_file ) | ssh -t -t remote_server 'sudo tar -C /some_directory' )
有没有更好的办法?
答案1
我找到了一种优雅的方法来解决这些问题命名管道。这个想法是通过在远程端运行 tar 命令先进先出使您的普通用户可以读取该套接字。
这是一个例子。在远程端,您首先创建套接字:
remote$ sudo -s
remote# mkfifo -m 600 /home/anarcat/tmpfifo
remote# chown anarcat /home/anarcat/tmpfifo
在本地端,您已经可以开始读取该套接字:
local$ ssh example.net "cat tmpfifo" | pv -s 2G | tar xfz -
(该pv -s 2G |
部分完全是可选的,以获得一个不错的进度条管道观察器.)
然后在远程端,您可以开始写入:
remote# tar cfz /home/anarcat/tmpfifo files
这将files
通过 SSH 连接进行复制。当然,您也可以直接在远程服务器上创建该 tarball 并使其可供用户访问,但这将需要存档的所有空间,而这些空间可能不可用。
完成此操作后,您可以将其fifo
作为简单文件删除:
remote$ rm /home/anarcat/tmpfifo