使用 Sudo 从 SSH 下载文件
Downloading a File from SSH with Sudo
我正在尝试从可从 ssh
访问的远程服务器检索文件 file.txt
,并将其内容复制到本地文件。但是我希望这个过程在 .sh
文件中完成。
问题是因为 file.txt
只能从 root 访问,这意味着为了手动查看文件的内容,我必须 运行:sudo cat file.txt
,并通过终端输入我的密码。因此 scp
之类的命令将无法完成工作,因为它们会抛出 Permission Denied
错误。
为了绕过这个,我做了以下操作。
ssh -t user@remote 'sudo cat file.txt'
然而,在bash文件中我打算将结果保存在一个变量中,如下所示:
CONTENT=$(ssh -t user@remote 'sudo cat file.txt')
询问我的密码后,将文件内容存储在变量 CONTENT
中。
如果用户输入他们的密码并按下回车键,这个变量就会被 file.txt
的内容填充;但是终端中不再打印密码界面。这意味着 运行 创建此 bash 文件的人看不到以下行:
[sudo] password for user:
或者密码输入错误时出现下面一行
Sorry, try again.
[sudo] password for user:
更糟糕的是,有时密码的前几个字符实际上会被输入终端!
有办法解决这个问题吗?有没有办法让用户真正看到密码界面?
有意思的是,在变量CONTENT
中可以看到[sudo] password for user:
和Sorry, try again.
行,所以不仅密码界面消失了,还污染了变量CONTENT
.然而,这不是问题,因为我们可以简单地解析 CONTENT
.
我投入了一些研究和努力,实际上它达到了我的期望(希望你也是)。
我把你的 file.txt
当作一个单行文件,因为变量 CONTENT
只存储一行输出。
$ cat file.txt
lorem ipsum dolor sit amet
一行:
$ CONTENT=$(expect -c 'spawn ssh -t user@localhost "sudo cat /tmp/file.txt"; expect "password"; send "userpassword\r"; expect "password"; send "userpassword\r"; interact' | sed -n '4p')
这是我得到的
$ echo $CONTENT
lorem ipsum dolor sit amet
请注意,userpassword
将替换为您输入的密码。
非单行
$ CONTENT=$(expect -c
'spawn ssh -t user@localhost "sudo cat /tmp/deneme.txt";
expect "password"; send "userpassword\r"; #for first prompt of remote connection.
expect "password"; send "userpassword\r"; #for second prompt of sudo.
interact' | sed -n '4p') #4th line displayed in the terminal is the file content.
您还可以在终端中看到没有 CONTENT
和 sed
部分的实际输出;
$ expect -c 'spawn ssh -t user@localhost "sudo cat /tmp/file.txt"; expect "password"; send "userpassword\r"; expect "password"; send "userpassword\r"; interact'
spawn ssh -t user@localhost sudo cat /tmp/file.txt
user@localhost's password:
[sudo] password for user:
lorem ipsum dolor sit amet
Connection to localhost closed.
关于expect -c 'spawn command; expect; send; interact'
的用法,我参考了这个posthttps://unix.stackexchange.com/a/252782/434132。
另请注意,我在我的 local host
上而不是 remote host
上在用户之间工作,所以我不知道它是否会产生不同的结果。
这是否回答了您的问题?
我正在尝试从可从 ssh
访问的远程服务器检索文件 file.txt
,并将其内容复制到本地文件。但是我希望这个过程在 .sh
文件中完成。
问题是因为 file.txt
只能从 root 访问,这意味着为了手动查看文件的内容,我必须 运行:sudo cat file.txt
,并通过终端输入我的密码。因此 scp
之类的命令将无法完成工作,因为它们会抛出 Permission Denied
错误。
为了绕过这个,我做了以下操作。
ssh -t user@remote 'sudo cat file.txt'
然而,在bash文件中我打算将结果保存在一个变量中,如下所示:
CONTENT=$(ssh -t user@remote 'sudo cat file.txt')
询问我的密码后,将文件内容存储在变量 CONTENT
中。
如果用户输入他们的密码并按下回车键,这个变量就会被 file.txt
的内容填充;但是终端中不再打印密码界面。这意味着 运行 创建此 bash 文件的人看不到以下行:
[sudo] password for user:
或者密码输入错误时出现下面一行
Sorry, try again.
[sudo] password for user:
更糟糕的是,有时密码的前几个字符实际上会被输入终端!
有办法解决这个问题吗?有没有办法让用户真正看到密码界面?
有意思的是,在变量CONTENT
中可以看到[sudo] password for user:
和Sorry, try again.
行,所以不仅密码界面消失了,还污染了变量CONTENT
.然而,这不是问题,因为我们可以简单地解析 CONTENT
.
我投入了一些研究和努力,实际上它达到了我的期望(希望你也是)。
我把你的 file.txt
当作一个单行文件,因为变量 CONTENT
只存储一行输出。
$ cat file.txt
lorem ipsum dolor sit amet
一行:
$ CONTENT=$(expect -c 'spawn ssh -t user@localhost "sudo cat /tmp/file.txt"; expect "password"; send "userpassword\r"; expect "password"; send "userpassword\r"; interact' | sed -n '4p')
这是我得到的
$ echo $CONTENT
lorem ipsum dolor sit amet
请注意,userpassword
将替换为您输入的密码。
非单行
$ CONTENT=$(expect -c
'spawn ssh -t user@localhost "sudo cat /tmp/deneme.txt";
expect "password"; send "userpassword\r"; #for first prompt of remote connection.
expect "password"; send "userpassword\r"; #for second prompt of sudo.
interact' | sed -n '4p') #4th line displayed in the terminal is the file content.
您还可以在终端中看到没有 CONTENT
和 sed
部分的实际输出;
$ expect -c 'spawn ssh -t user@localhost "sudo cat /tmp/file.txt"; expect "password"; send "userpassword\r"; expect "password"; send "userpassword\r"; interact'
spawn ssh -t user@localhost sudo cat /tmp/file.txt
user@localhost's password:
[sudo] password for user:
lorem ipsum dolor sit amet
Connection to localhost closed.
关于expect -c 'spawn command; expect; send; interact'
的用法,我参考了这个posthttps://unix.stackexchange.com/a/252782/434132。
另请注意,我在我的 local host
上而不是 remote host
上在用户之间工作,所以我不知道它是否会产生不同的结果。
这是否回答了您的问题?