ftp_chmod() 函数通过FTP连接设置文件或目录的权限。
ftp_chmod(resource $ftp_stream, int $mode, string $filename)
| 参数 | 描述 |
|---|---|
$ftp_stream |
必需。FTP连接的资源标识符,由ftp_connect()或ftp_ssl_connect()返回。 |
$mode |
必需。要设置的权限值,使用八进制表示法(例如:0755)。
常用权限值:
|
$filename |
必需。远程服务器上的文件或目录路径。 |
false连接到FTP服务器并设置文件权限:
<?php
// 连接参数
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
// 建立连接
$conn_id = ftp_connect($ftp_server);
if ($conn_id) {
// 登录
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
if ($login_result) {
echo "FTP连接成功\n";
// 设置文件权限为0644
$file = "public_html/index.php";
if (ftp_chmod($conn_id, 0644, $file) !== false) {
echo "文件 '{$file}' 权限已设置为0644\n";
} else {
echo "设置权限失败\n";
}
// 设置目录权限为0755
$dir = "public_html/uploads";
if (ftp_chmod($conn_id, 0755, $dir) !== false) {
echo "目录 '{$dir}' 权限已设置为0755\n";
} else {
echo "设置目录权限失败\n";
}
} else {
echo "FTP登录失败\n";
}
// 关闭连接
ftp_close($conn_id);
} else {
echo "无法连接到 {$ftp_server}\n";
}
?>
<?php
// 使用SSL安全连接
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
// 建立SSL连接
$conn_id = ftp_ssl_connect($ftp_server);
if ($conn_id) {
if (ftp_login($conn_id, $ftp_user, $ftp_pass)) {
// 开启被动模式(某些服务器需要)
ftp_pasv($conn_id, true);
// 设置可执行文件权限
$script = "public_html/cgi-bin/script.cgi";
if (ftp_chmod($conn_id, 0755, $script)) {
echo "脚本 '{$script}' 已设置为可执行\n";
}
// 设置配置文件权限为只读
$config = "public_html/config.ini";
if (ftp_chmod($conn_id, 0644, $config)) {
echo "配置文件 '{$config}' 权限已设置\n";
}
}
ftp_close($conn_id);
}
?>
<?php
// 批量设置网站文件权限
function setWebPermissions($ftp_conn, $directory) {
$files = ftp_nlist($ftp_conn, $directory);
foreach ($files as $file) {
// 获取文件信息判断类型
$file_info = ftp_rawlist($ftp_conn, $file);
// 简单判断是否为目录(根据rawlist返回的字符串)
if (strpos($file_info[0], 'd') === 0) {
// 目录设置为0755
ftp_chmod($ftp_conn, 0755, $file);
echo "目录: {$file} - 0755\n";
// 递归处理子目录
setWebPermissions($ftp_conn, $file);
} else {
// 根据扩展名设置文件权限
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
switch ($ext) {
case 'php':
case 'cgi':
case 'pl':
// 可执行脚本
ftp_chmod($ftp_conn, 0755, $file);
echo "脚本: {$file} - 0755\n";
break;
case 'txt':
case 'ini':
case 'conf':
// 配置文件
ftp_chmod($ftp_conn, 0644, $file);
echo "配置: {$file} - 0644\n";
break;
default:
// 普通文件
ftp_chmod($ftp_conn, 0644, $file);
echo "文件: {$file} - 0644\n";
}
}
}
}
// 使用示例
$conn = ftp_connect("ftp.example.com");
if ($conn && ftp_login($conn, "user", "pass")) {
setWebPermissions($conn, "public_html");
ftp_close($conn);
}
?>
<?php
// 带有错误处理的权限设置
function safeFtpChmod($ftp_conn, $mode, $filename) {
// 检查连接是否有效
if (!is_resource($ftp_conn)) {
trigger_error("无效的FTP连接", E_USER_WARNING);
return false;
}
// 检查文件是否存在
$file_size = ftp_size($ftp_conn, $filename);
if ($file_size == -1) {
trigger_error("文件 '{$filename}' 不存在", E_USER_WARNING);
return false;
}
// 设置权限
$result = ftp_chmod($ftp_conn, $mode, $filename);
if ($result === false) {
trigger_error("无法设置 '{$filename}' 的权限", E_USER_WARNING);
return false;
}
// 验证权限是否设置成功
$actual_mode = decoct($result);
$expected_mode = decoct($mode);
if ($actual_mode != $expected_mode) {
trigger_error("权限设置不匹配:期望{$expected_mode},实际{$actual_mode}", E_USER_NOTICE);
}
return $result;
}
// 使用示例
$conn = ftp_connect("ftp.example.com");
if ($conn && ftp_login($conn, "user", "pass")) {
$result = safeFtpChmod($conn, 0644, "public_html/index.php");
if ($result !== false) {
echo "权限设置成功,新权限:" . decoct($result) . "\n";
}
ftp_close($conn);
}
?>
| 权限 | 数字 | 说明 |
|---|---|---|
| --- | 0 | 无权限 |
| --x | 1 | 执行 |
| -w- | 2 | 写入 |
| -wx | 3 | 写入+执行 |
| r-- | 4 | 读取 |
| r-x | 5 | 读取+执行 |
| rw- | 6 | 读取+写入 |
| rwx | 7 | 读取+写入+执行 |
三位数字分别代表:所有者、组用户、其他用户
例如:0755 = 所有者(rwx)、组用户(r-x)、其他用户(r-x)
<?php
if (extension_loaded('ftp')) {
echo "FTP扩展已启用";
} else {
echo "FTP扩展未启用";
// 在php.ini中添加:extension=ftp
}
?>
<?php
$result = ftp_chmod($conn, 0755, "file.txt");
if ($result !== false) {
echo "权限值:" . decoct($result); // 输出:755
echo "权限设置成功";
}
?>
| 函数 | 描述 |
|---|---|
ftp_connect() |
建立FTP连接 |
ftp_login() |
登录FTP服务器 |
ftp_close() |
关闭FTP连接 |
ftp_ssl_connect() |
建立SSL-FTP连接 |
chmod() |
设置本地文件权限 |