シェルが使えないレンタルサーバでシンボリックリンクを使う

安価なレンタルサーバはシェル操作できないことも多く、その場合直接シンボリックリンクを設定できない。私が契約しているさくらのレンタルサーバ(ライトプラン)も月々100円程度で格安だがシェル操作できない。実は、一見シェルでないと出来ないようなこともCGIではできることがある。幸い、使用しているレンタルサーバーではCGIでシンボリックリンクが設定できる。今回は、シンボリックリンクを行う簡単なCGIをperlで作成したので紹介する。

#インストール

シェルを使えば簡単なのだが、シェルは使えない前提ですすめる。

### 1 menteデレクトリィを作る。 
 ftpクライアントなどで作成する。デレクトリィ名は、なんでも構わないが、仮にmenteとした。
### 2 CGI ファイル ln,cgiを作成する。
 ローカルPCでファイルを作成し、ftpクライアントなどでファイル名ln,cgiアップロードする。 

```perl:ln.cgi
#!/usr/bin/perl
use utf8;
use CGI;
use File::Find;
use Cwd;

my $dir = Cwd::getcwd();
$dir=~ s/([^\/]+?)?$//; #実行デレクトリィより一つ上から全て走査する。

my $cgi = new CGI;
my $target = $cgi->param('target');
my $link = $cgi->param('link');
our $msg='';
# $msg=$dir;

if($target ne '' && $link ne ''){
  $msg.="$target のシンボリックリンク($link)を生成します。";
  if( (symlink $target,$link) == 0){
    $msg.="失敗しました。";
  }else{
    $msg.="成功しました。";
  }
}


our $fileTable="";
our @files=();

find sub {
  my $file = $_;
  my $path = $File::Find::name;
  if ((-f $path) || (-l $path)){
    push(@files,$path);
  }
},$dir;


for(sort @files){
    $fileTable.="<tr><td>$_</td></tr>";
}

print $cgi->header(
  -type=>'text/html',
  -expires=>'0',
  -charset=>'utf-8'
);

my $script=<<'JOE';
$(function(){
  $("#fileTable td").on("click",function(){
   $("#target").val($(this).html());
 })
});
JOE

print << "EOF";
<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="utf-8" />
<!-- <link reil="stylesheet"  href="style.css"> -->
<style>
ul{
  list-style: none;
}
label{
  display:block;
  float:left;
  width :7em;
}

table#fileTable tr:hover {
   cursor : default;
   background-color: #f9cccc;
}
</style>


<title>シンボリックリンクの設定</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
 crossorigin="anonymous"></script>
</head>
<body>
<main>
  <h1>シンボリックリンクの設定</h1>
        <div>$msg</div>
        <form>
        <ul>
        <li><label for="target">ターゲット:</label><input name="target" size=100 id="target"></li>
        <li><label for="link">リンク先:</label><input name="link" id="link" size=100  id="link"></li>
        <li><input type="submit" value="実行"><input type="reset" value="削除"></li>
        </ul>
        </form>
        <h2>ファイルリスト</h2>
  <table id="fileTable">
   $fileTable
   </table>
</main>
<footer>
<hr>
&copy; 2018 00index.com<br>
説明:
<a href="https://qiita.com/items/e99d1f3db7de280de36d">https://qiita.com/items/e99d1f3db7de280de36d</a>
</footer>
<script>
$script
</script>
</body>
</html>
EOF
```

###3 ln.cgiのアクセス制限を設定する。
 .htaccessなどで、このCGIが他の人にアクセスされないように制限を行う。難しければ、ln.cgiを都度削除する。このスクリプトは、***セキュリティを考慮していない***ので、不正に利用されないように注意しなければならない。

###4. ln.cgiに実行権を設定する。
 ftpクライアントなどで、パーミッションを設定する。サーバーによって異なるが、755等。


##シェルが使える場合
あまり使用しないと思うが、一応記載しておく。改造し他の用途にする場合の参考にして欲しい。アクセス制限については省略した。

```
mkdir mente
curl -o mente/ln.cgi https://00index.com/basefile/ln.txt
chmod 755 mente/ln.cgi
```
#使い方
CGIを動作させるとファイルリストが表示されるので、マウスでファイル名をクリックするとターゲットの欄にファイル名がコピーされる。リンク先入力欄にシンボリックリンクさせるパスとファイル名を入力し実行ボタンを押す。リンクが生成されたら、その旨のメッセージが表示される。リンクを消すとときはftpクライアントなどを利用し、削除すれば良い。削除ボタンは、入力欄を削除するだけなので注意してほしい。

![ln.png](https://qiita-image-store.s3.amazonaws.com/0/171932/4b6b5bb4-bdc3-4fff-fc2f-da2c886133f4.png)


#######誤りやもっといい方法など、ご指摘ください。