Contents

WinSCP 用 sudo 上傳檔案的方法

使用 WinSCP 透過 SFTP 上傳檔案時,如果目標目錄屬於 root 或特定群組,一般使用者沒有寫入權限,就會遇到「Permission denied」的錯誤。此時需要讓 WinSCP 的 SFTP 連線以 sudo 方式執行,才能突破目錄權限限制。

為什麼需要 sudo 上傳?

Linux 系統的目錄通常有嚴格的權限控制。例如 /etc/nginx/conf.d//var/www/html/ 這類目錄,擁有者可能是 root,一般使用者即使能 SSH 登入也無法直接寫入。使用 WinSCP 以一般帳號連線時,SFTP 服務以該帳號的身份執行,自然也無法寫入 root 所有的目錄。

解決方法一:修改 SFTP Server 路徑(推薦)

在 WinSCP 中將 SFTP Server 的執行路徑改為透過 sudo 啟動,步驟如下:

  1. 開啟 WinSCP,選擇或建立一個 Session
  2. 點選 Advanced…(進階設定)
  3. 展開左側 EnvironmentSFTP
  4. 找到 SFTP server 欄位,預設是空白(使用系統預設)
  5. 填入以下路徑:
1
sudo /usr/lib/openssh/sftp-server

注意:不同 Linux 發行版的 sftp-server 路徑可能不同,常見路徑:

  • Ubuntu / Debian:/usr/lib/openssh/sftp-server
  • CentOS / RHEL:/usr/libexec/openssh/sftp-server
  1. 確認伺服器端的 /etc/sudoers 允許該使用者無密碼執行 sftp-server:
1
2
# 在 /etc/sudoers 加入(用 visudo 編輯)
youruser ALL=(ALL) NOPASSWD: /usr/lib/openssh/sftp-server

設定完成後,WinSCP 連線時 SFTP 會以 root 身份執行,即可上傳到受保護的目錄。

解決方法二:先上傳到 /tmp,再用 SSH 移動

如果不想修改 sudoers,可採用兩段式做法:

  1. 用 WinSCP 將檔案上傳到使用者有寫入權限的目錄,例如 /home/youruser//tmp/
  2. 在 WinSCP 的 Terminal 或另開 SSH 連線,用指令移動:
1
2
sudo mv /home/youruser/myfile.conf /etc/nginx/conf.d/myfile.conf
sudo chown root:root /etc/nginx/conf.d/myfile.conf

解決方法三:修改目標目錄的權限

如果目錄是自己管理的(非系統目錄),可以直接修改擁有者或群組:

1
2
3
4
5
6
# 將目錄擁有者改為登入使用者
sudo chown youruser:youruser /var/www/html

# 或將使用者加入對應群組,並讓目錄對群組可寫
sudo usermod -aG www-data youruser
sudo chmod g+w /var/www/html

修改後重新登入讓群組生效,即可直接上傳,不需要 sudo 設定。

切換群組(newgrp)

若要在目前 Session 中立即切換有效群組而不重新登入,可使用:

1
newgrp www-data

參考資料