问题描述
我有一台使用SSH连接的Ubuntu服务器。
我需要从我的机器上传文件到服务器上的/var/www/
中,/var/www/
中的文件由root
拥有。
使用PuTTY登录后,我必须首先键入sudo su
和我的密码才能修改/var/www/
中的文件。
但是当我使用WinSCP复制文件时,我无法在/var /www /中创建创建/修改文件,因为我正在连接的用户对/var /www /中的文件没有权限,而且我也无法说sudo su,就像我在ssh会话中一样。
你知道我可以如何处理这个?
如果我在本地机器上工作,我会调用gksudo nautilus
,但在这种情况下,我只能通过终端访问机器。
最佳解决办法
你是对的,在与scp
合作时没有sudo
。一种解决方法是使用scp
上传文件到您的用户有权限创建文件的目录,然后通过ssh登录和使用sudo
于/COPY文件移动到它们的最终目的地。
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
另一种解决方案是更改上传文件的目录的权限/所有权,以便您的non-privileged用户能够写入这些目录。
一般来说,在root
帐户中工作应该是一个例外,而不是一个规则 – 您对问题进行措辞的方式会让我觉得您可能会滥用它,这反过来会导致权限问题 – 在正常情况下您不会需要super-admin权限才能访问您自己的文件。
从技术上讲,您可以将Ubuntu配置为允许直接以root
的身份进行远程登录,但由于某种原因该功能被禁用,因此我强烈建议您不要这样做。
次佳解决办法
另一种方法是使用tar + ssh而不是scp来复制:
tar -c -C ./my/local/dir \
| ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
第三种解决办法
您也可以使用ansible
完成此操作。
使用安全的copy
模块复制到远程主机:
ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all
使用安全的fetch
模块从远程主机获取:
ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all
注意:
-
-i HOST,
语法中的逗号不是拼写错误。这是使用安全而不需要库存文件的方式。 -
-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
简洁的调用是:
cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all
P.S.,我意识到说“只是安装这个神话般的工具”就是一种tone-deaf答案。但是我发现它对于管理远程服务器非常有用,所以安装它肯定会为您带来除部署文件之外的其他好处。
第四种办法
当您运行sudo su
时,您创建的任何文件都将由root拥有,但默认情况下不可以直接以root身份使用ssh或scp登录。用scp也不可能使用sudo,所以文件不可用。声明对您的文件拥有所有权来解决此问题:
假设你的用户名是dimitri,你可以使用这个命令。
sudo chown -R dimitri:dimitri /home/dimitri
从那时起,正如其他答案中提到的那样,”Ubuntu”的方式是使用sudo,而不是root登录。这是一个有用的范例,具有很大的安全优势。
第五种办法
可能最好的方法是通过SSH使用rsync
(Windows中的Cygwin /cwRsync)?
例如,要用所有者www-data
上传文件,请执行以下操作:
rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www
在你的情况下,如果你需要root权限,命令将是这样的:
rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www
请参阅:scp to remote server with sudo。
第六种办法
如果您使用OpenSSH工具而不是PuTTY,则可以通过在sudo
服务器上启动scp
文件传输来完成此操作。确保您的本地计算机上运行了sshd
守护程序。借助ssh -R
,您可以为服务器提供联系您的机器的方法。
在你的机器上:
ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME
除了将您登录到服务器上之外,它还会将服务器端口11111上的每个连接都转发到您计算机的端口22:您的sshd
正在监听的端口。
在服务器上,像这样开始文件传输:
cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .
第七种办法
快速的方法:
ssh user@server "sudo cat /etc/dir/file" > /home/user/file