Unix で JSCH を使用してディレクトリのパーミッションを設定するにはどうすればよいですか? 私はdrwxrwxrwxをやろうとしています。Filezilla はその整数が 775 であると言っていますが、JSCH はパーミッションを正しく設定していません。JSCH がパーミッションを設定した後、Filezilla はそれが 407 であると言います。
4 に答える
これは私にはうまくいきます:
sftp.chmod(Integer.parseInt(permissionStringInDecimal,8), str_Directory+fileName);
Unix のファイル許可コード (777
など) は、10 進数ではなく 8 進数です。のように: のようなことをするchmod -R 777
と、数字は 10 進入力ではなく 8 進入力として解釈されます。
このシステムは、3 つの権限グループがあるという事実から来ています。
- オーナー
- グループ
- 世界
各グループには、次の「オン/オフ ビット」があります。
- 読んだ
- 書きます
- 実行する
そのため、8 進数は、グループの可能なすべての許可構成を表すのに十分です。8 進数の 3 桁は、それぞれ許可グループに対応します。
(これについてさらに読むには: http://www.december.com/unix/ref/chmod.html )
JSCH の問題に戻ります: 10 進整数775
の 8 進表現は です0o1407
。私の疑いでは、実際には 8 進 775 ではなく 10 進 775 が送信され、FileZilla は 3 番目の最下位桁の左側にあるものを切り捨てている可能性があります。 of 0o1407
(3 番目の最下位ビットを超えて何もないと仮定するのは不合理ではないため)
現在、509
は octal の 10 進数表現です775
。代わりに JSCH でそれを使用してみてください。
これは、Jsch を使用して CHMOD パーミッションを宣言する通常の方法を使用して chmod を簡単に変更する方法の短い完全な例です。
================================================== ======= 短い答え: int chmodInt = Integer.parseInt(chmod, 8); channel.chmod(chmodInt, fileLinux);
================================================== ======= 完全な例:
package example;
import java.io.IOException;
import java.util.Date;
import main.services.ServiceSSH;
import org.junit.Test;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
public class ExampleChmod {
@Test
public void testchmod() throws JSchException, SftpException, IOException {
Session session = ServiceSSH.getSession(); // Use your own session Factory
Date dateStart = new Date();
chmod("/home/user/launcher.sh", "777", session);
Date dateEnd = new Date();
session.disconnect();
System.out.println(dateEnd.getTime() - dateStart.getTime() + "ms");
}
public static void chmod(String fileLinux, String chmod, Session session) throws JSchException, SftpException {
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
chmod(fileLinux, chmod, channel);
channel.disconnect();
}
private static void chmod(String fileLinux, String chmod, ChannelSftp channel) throws SftpException {
int chmodInt = Integer.parseInt(chmod, 8);
channel.chmod(chmodInt, fileLinux);
}
}