Dim*_*kas 202 server ssh root webserver
我有一个使用 SSH 连接的 Ubuntu 服务器。
我需要将文件从我的机器上传到/var/www/
服务器上,其中的文件/var/www/
归root
.
使用 PuTTY,在我登录后,我必须先输入sudo su
我的密码才能修改/var/www/
.
但是,当我复制使用WinSCP赋予文件,我不能创建创建/修改中的文件/var/www/
,因为我与连接用户没有对文件的权限/var/www/
,我不能说sudo su
,因为我在一个SSH会话的情况下做.
你知道我怎么处理这个吗?
如果我在我的本地机器上工作,我会打电话,gksudo nautilus
但在这种情况下,我只能通过终端访问机器。
Ser*_*gey 143
你是对的,sudo
在使用scp
. 一种解决方法是使用scp
将文件上传到您的用户有权创建文件的目录,然后通过 ssh 登录并用于sudo
将文件移动/复制到其最终目的地。
scp -r folder/ user@server.tld:/some/folder/you/dont/need/sudo
ssh user@server.tld
$ sudo mv /some/folder /some/folder/requiring/perms
# YOU MAY NEED TO CHANGE THE OWNER like:
# sudo chown -R user:user folder
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是更改您将文件上传到的目录的权限/所有权,以便您的非特权用户能够写入这些目录。
一般来说,在root
帐户中工作应该是一个例外,而不是规则——你表达问题的方式让我觉得你可能有点滥用它,这反过来会导致权限问题——在正常情况下你不需要访问您自己的文件的超级管理员权限。
从技术上讲,您可以将 Ubuntu 配置为允许直接以 远程登录root
,但由于某种原因禁用了此功能,因此我强烈建议您不要这样做。
小智 82
快捷方式
从服务器到本地机器:
ssh user@server "sudo cat /etc/dir/file" > /home/user/file
Run Code Online (Sandbox Code Playgroud)
从本地机器到服务器:
cat /home/user/file | ssh user@server "sudo tee -a /etc/dir/file"
Run Code Online (Sandbox Code Playgroud)
小智 43
另一种方法是使用 tar + ssh 而不是 scp 进行复制:
tar -c -C ./my/local/dir \
| ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
Run Code Online (Sandbox Code Playgroud)
小智 31
您也可以使用它ansible
来完成此操作。
copy
模块复制到远程主机:ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all
Run Code Online (Sandbox Code Playgroud)
fetch
模块从远程主机获取:ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all
Run Code Online (Sandbox Code Playgroud)
笔记:
-i HOST,
语法中的逗号不是拼写错误。这是在不需要库存文件的情况下使用 ansible 的方法。-b
导致以 root 身份在服务器上执行操作。-b
扩展为--become
,默认--become-user
为 root,默认--become-method
为 sudo。flat=yes
张刚的文件,不会复制整个远程路径通往文件copy
模块,而不是由fetch
模块。这是一个特定且完全指定的示例,假设包含要分发的文件的本地主机上的目录是sourcedir
,并且远程目标的主机名是hostname
:
cd sourcedir && \
ansible \
--inventory-file hostname, \
--become \
--become-method sudo \
--become-user root \
--module-name copy \
--args "src=. dest=/var/www/" \
all
Run Code Online (Sandbox Code Playgroud)
简洁的调用是:
cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all
Run Code Online (Sandbox Code Playgroud)
PS,我意识到说“只需安装这个出色的工具”是一种聋哑的回答。但我发现ansible是超级用于管理远程服务器有用的,所以在安装它必将为你带来超越部署文件的其他好处。
Ale*_*nov 16
最好的方法可能是通过 SSH使用rsync
(Windows 中的Cygwin / cwRsync)?
例如,使用 owner 上传文件www-data
:
rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www
Run Code Online (Sandbox Code Playgroud)
在您的情况下,如果您需要 root 权限,命令将如下所示:
rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www
Run Code Online (Sandbox Code Playgroud)
请参阅:使用 sudo scp 到远程服务器。
tro*_*ers 12
当您运行 时sudo su
,您创建的任何文件都将由 root 拥有,但默认情况下无法直接以 root 身份使用 ssh 或 scp 登录。也不能将 sudo 与 scp 一起使用,因此文件不可用。通过声明对文件的所有权来解决此问题:
假设您的用户名是 dimitri,您可以使用此命令。
sudo chown -R dimitri:dimitri /home/dimitri
Run Code Online (Sandbox Code Playgroud)
从那时起,如其他答案中所述,“Ubuntu”方式是使用 sudo,而不是 root 登录。这是一个有用的范例,具有很大的安全优势。
小智 6
如果您使用 OpenSSH 工具而不是 PuTTY,则可以通过scp
在服务器上使用sudo
. 确保您sshd
的本地机器上有一个守护进程正在运行。有了ssh -R
你可以给服务器的方式来联系你的机器。
在您的机器上:
ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME
Run Code Online (Sandbox Code Playgroud)
除了让您登录到服务器之外,这会将在服务器端口 11111 上建立的每个连接转发到您机器的端口 22:您sshd
正在侦听的端口。
在服务器上,像这样开始文件传输:
cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
387668 次 |
最近记录: |