프로그래밍/기타...2011. 5. 17. 10:08
우분투에서 samba를 이용해서 파일공유 사용하기

파일을 공유하려는 서버에서 아래와 같이 삼바 패키지를 설치한다.
sudo apt-get install samba smbfs

이 공유에 접근할 아이디와 비밀번호를 설정한다.
sudo smbpasswd -a 아이디

접근 아이디를 지울 때는 다음과 같이 한다.
sudo smbpasswd -x system_username

삼바 서버를 설정하기 위해 문서 편집기로 설정파일을 연다.
sudo vim /etc/samba/smb.conf

그 안에 다음과 같은 내용을 입력한다.

# 기본적인 설정
[global]
# 워크그룹이름은 맘대로 정한다.
workgroup = WORKGROUP
encrypt passwords = yes
# 접근을 허락할 아이피 범위
hosts allow = 192.168.
# 문자 인코딩 설정, 우분투는 utf-8을 기본적으로 사용하고
# 이것이 윈도우즈에서도 한글이 잘 깨지지 않는다.
unix charset=utf-8
dos charset=utf-8
#공유할 디렉토리 이름, 이것은 여러개를 만들 수도 있다.
[MyDoc]
comment = My Documents
path = /공유할/디렉토리
#읽기 전용으로 접근할지 여부
read only = no
browsable = yes


삼바의 설정은 매우 다양하게 할 수 있다.
아래에 다양한 삼바 설정을 설명했다.

삼바 설정이 끝났으면, 설정이 제대로 되었는지 검사한다.
sudo testparm

문제가 없으면 삼바를 실행한다.
sudo /etc/init.d/samba restart

우분투에서 패키지로 설치된 삼바는 컴퓨터가 켜질 때마다 실행될 것이다.

우분트 클라이언트에서 공유에 접근하는 법은 두가지이다.

첫째)
위치 메뉴 > 서버에 연결 을 선택한 후,
서비스 종류는 Windows공유를 지정하고,
사용자 이름과 연결에 사용할 이름 부분만 위에서 지정한 네트워크사용자아이디를 지정하면 된다.

둘째)
mount -t cifs //삼바서버아이피/삼바공유폴더이름 /공유가/지정될/로컬폴더 -o username=네트워크사용자아이디,password=비밀번호,iocharset=utf8,file_mode=0777,dir_mode=0777
-o 이후로는 띄어쓰기를 해서는 안된다.

윈도우즈에서 삼바 서버에 접근하려면,
네트워크 환경에서 새 연결을 설정하거나,
net use o: \\삼바서버아이피\삼바공유폴더이름 비밀번호 /user:네트워크사용자아이디
로 연결하면 되고,
삭제는 net use o: /delete
로 하면 된다.


====================================================================================

그외의 다양한 삼바 설정법은 다음과 같다.

▶ 네트워크 사용자 추가/편집/삭제 하는 법

☞ 네트워크 사용자 추가하기

sudo smbpasswd -a 네트워크사용자아이디
sudo vim /etc/samba/smbusers 를 한 후에, 아래의 내용을 추가한다.

네트워크사용자아이디 = "network username"

☞ 네트워크 사용자 편집

sudo smbpasswd -a 네트워크사용자아이디

☞ 네트워크 사용자 삭제

sudo smbpasswd -x 네트워크사용자아이디

----------------------------------------------------------------------------------
▶ 읽기 전용으로 폴더 공유하기 (인증=Yes)

sudo vim /etc/samba/smb.conf 로 설정파일을 열고

아래의 내용을 찾아서
security = user

아래처럼 바꾼다
security = user
username map = /etc/samba/smbusers

아래 내용의 앞에 있는 주석 표시를 제거한다.

;[homes]
;comment = Home Directories
;browseable = no
;valid users = %S
;writable = yes

삼바설정을 확인한다.
sudo testparm

삼바를 다시 시작한다.
sudo /etc/init.d/samba restart

----------------------------------------------------------------------------------
▶ 읽기/쓰기 권한으로 폴더 공유하기 (인증=Yes)

설정파일 안의 지정된 폴더에 아래의 옵션을 넣어준다.

(보기)

[MyFolder]
path = /home/my_id/my_shared_folder
writable = yes


----------------------------------------------------------------------------------
▶ 그룹 폴더들을 읽기 전용으로 공유하기 (인증=Yes)

sudo mkdir /home/group
sudo chmod 777 /home/group/
sudo vim /etc/samba/smb.conf

설정파일에서 아래의 내용을
security = user

아래처럼 바꾸고
security = user
username map = /etc/samba/smbusers

설정파일의 끝에 아래의 내용을 추가한다.

[Group]
comment = Group Folder
path = /home/group
public = yes
writable = no
valid users = system_username1 system_username2
create mask = 0700
directory mask = 0700
force user = nobody
force group = nogroup


----------------------------------------------------------------------------------
▶ 그룹 폴더를 읽기/쓰기 권한으로 공유하기 (인증=Yes)

설정파일의 끝에 추가된 그룹 설정을 아래처럼 바꾼다.

[Group]
comment = Group Folder
path = /home/group
public = yes
writable = yes
valid users = system_username1 system_username2
create mask = 0700
directory mask = 0700
force user = nobody
force group = nogroup

----------------------------------------------------------------------------------
▶ 공개 폴더를 읽기 전용으로 공유하기 (인증=Yes)

[global]
security = share

[public]
comment = Public Folder
path = /home/public
public = yes
writable = no
create mask = 0777
directory mask = 0777
force user = nobody
force group = nogroup

아래처럼 nobody 계정을 만든다.

sudo smbpasswd nobody

----------------------------------------------------------------------------------
▶ 공개 폴더를 읽기/쓰기 권한으로 공유하기 (인증=Yes)

[global]
security = share

[public]
comment = Public Folder
path = /home/public
public = yes
writable = yes
create mask = 0777
directory mask = 0777
force user = nobody
force group = nogroup

----------------------------------------------------------------------------------
▶▶▶ 네트워크 프린터에서 인쇄하기

삼바 설정파일에 다음의 내용을 추가하고

printing = cups
printcap name = cups

프린터 관리 서비스를 다시 시작한다.

sudo /etc/init.d/cupsys restart


----------------------------------------------------------------------------------
▶▶▶ 웹을 통해 삼바 설정 관리하기 : SWAT : Samba Web Administration Tool

▶ INETD과 SWAT 를 설치한다.

sudo apt-get install netkit-inetd
sudo apt-get install swat


☞ inetd daemon 설정을 편집한다.

sudo vim /etc/inetd.conf

☞ 아래의 내용을 찾아서

<#off#> swat stream tcp nowait.400 root /usr/sbin/tcpd /usr/sbin/swat

☞ 아래처럼 바꾸어 준다.

swat stream tcp nowait.400 root /usr/sbin/swat swat

☞ 대몬을 재시작한다.

sudo /etc/init.d/inetd restart

☞ 만일, root비밀번호를 설정하지 않았다면, 아래처럼 설정한다.

sudo passwd root

☞ http://localhost:901 주소로 접속한다.

출처 : [기타] 인터넷 : http://ubuntuguide.org/wiki/Ubuntu:Feisty#Samba_Server

반응형
Posted by 컴투

안드로이드에서 사용할 수 있는 permission 종류

<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCOUNT_MANAGER"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.BATTERY_STATS"/>
<uses-permission android:name="android.permission.BIND_APPWIDGET"/>
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN"/>
<uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
<uses-permission android:name="android.permission.BIND_WALLPAPER"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BRICK"/>
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/>
<uses-permission android:name="android.permission.BROADCAST_SMS"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.DIAGNOSTIC"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.DUMP"/>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.FACTORY_TEST"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.FORCE_BACK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.GLOBAL_SEARCH"/>
<uses-permission android:name="android.permission.HARDWARE_TEST"/>
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_APP_TOKENS"/>
<uses-permission android:name="android.permission.MASTER_CLEAR"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.PERSISTENT_ACTIVITY"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"/>
<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.READ_INPUT_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
<uses-permission android:name="android.permission.SET_ALWAYS_FINISH"/>
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
<uses-permission android:name="android.permission.SET_DEBUG_APP"/>
<uses-permission android:name="android.permission.SET_ORIENTATION"/>
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
<uses-permission android:name="android.permission.SET_PROCESS_LIMIT"/>
<uses-permission android:name="android.permission.SET_TIME"/>
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
<uses-permission android:name="android.permission.STATUS_BAR"/>
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"/>
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_GSERVICES"/>
<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.WRITE_OWNER_DATA"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>

반응형
Posted by 컴투
커티(Qwerty) 자판이 달려있는 폰 개발을 하는 과정에서

Home key, EndCall Key, Back key, Sym key를 제한하게 되었다

1. key 이벤트를 사용하는 경우에는 아래의 메소드를 Override해서 사용해서 제한하면 되는데,
 Back key를 제한하기 위해서 사용하는 방법으로 onBackPressed()를 사용하거나 혹은
dispatchKeyEvent에서 사용을 제한하면 된다.

1).
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
    Log.d("ramses8", "dispatchKeyEvent");
    return super.dispatchKeyEvent(event);
}

2).
@Override
public void onBackPressed()
{

  super
.onBackPressed();

  Log.d(
"ramses8", "onBackPressed");
}
3).
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    Log.d("ramses8", "onKeyDown");
   
return super.onKeyDown(keyCode, event);
}

2. Home Key, Back Key의 경우에는

\frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java

클래스 내에 아래의 Method부분에서 수정을 해주면 된다.

public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down,
            int repeatCount, int flags)

public int interceptKeyTq(RawInputEvent event, boolean screenIsOn)


3. 커티자판이 있는 폰의 Sym key 키를 제한하는 경우에는
frameworks\base\core\java\android\view\inputmethod\InputMethodManager.java

아래의 showInputMethodPicker(); 부분이 실행되지 않도록 막아준다.

그리고 dispatchKeyEvent(KeyEvent event)를 @Override해서 내용에 실행하고자 하는 이벤트를 넣어준다.

나의 경우에는 현재 실행되고 있는 Activity가 내가 keyEvent 제한을 줄려고 하는 Activity와 동일한지 비교하여
사용을 제한하였다...Activity비교 코드는 생략....

/**
     * @hide
     */
    public void dispatchKeyEvent(Context context, int seq, KeyEvent key,
            IInputMethodCallback callback) {
        synchronized (mH) {
            if (DEBUG) Log.d(TAG, "dispatchKeyEvent");
   
            if (mCurMethod == null) {
                try {
                    callback.finishedEvent(seq, false);
                } catch (RemoteException e) {
                }
                return;
            }
   
            if (key.getAction() == KeyEvent.ACTION_DOWN
                    && key.getKeyCode() == KeyEvent.KEYCODE_SYM) {
                showInputMethodPicker();
                try {
                    callback.finishedEvent(seq, true);
                } catch (RemoteException e) {
                }
                return;
            }
            try {
                if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod);
                mCurMethod.dispatchKeyEvent(seq, key, callback);
            } catch (RemoteException e) {
                Log.w(TAG, "IME died: " + mCurId + " dropping: " + key, e);
                try {
                    callback.finishedEvent(seq, false);
                } catch (RemoteException ex) {
                }
            }
        }
반응형
Posted by 컴투
Unlocking Android에 나와 있는 코드를 이용하여 아래와 같이 만들어 사용하였다..
코드가 길지 않기 때문에 주석은 생략...

----- 변수 선언 ------
    private final String mPath = "/mnt/sdcard";    //SD카드 기본경로
    private final String mNewFolder = "test_folder";    //폴더이름
    private File mFile = null;
    private String mFilePath = null;
    private byte[] mTestFile = "1234".getBytes();
    private static String mFileName = System.currentTimeMillis() + ".txt";
----- 변수 선언 ------

1. 파일 생성
private boolean createFileFolder()
    {
        File fileDir = new File( mPath );
        try
        {
            if( fileDir.exists() && fileDir.canWrite() )
            {
                mFilePath = fileDir.getAbsolutePath() + "/" + mNewFolder;
                Log.e( "getAbsolutePath()", "getAbsolutePath() = "  + fileDir.getAbsolutePath() );
                File newFolder = new File( mFilePath );
                newFolder.mkdir();
                if( newFolder.exists() && newFolder.canWrite() )
                {
                    mFile = new File( newFolder.getAbsolutePath() + "/" + mFileName );
                    if( true == mFile.exists() )
                    {
                        mFile.delete();
                        if( DEBUG )
                            Log.d( LOG, "FILE EXIST" );
                    }
                    mFile.createNewFile();
                }
                else
                {
                    return false;
                }
            }
        }
        catch( Exception e )
        {
            return false;
        }
        return true;
    }
    
// 파일 쓰기
    private boolean writeFile()
    {
        byte[] fileContent = "1234".getBytes();
        FileOutputStream fos = null;
       
        try
        {
            fos = new FileOutputStream( mFile );
            fos.write( fileContent );
            fos.close();
            fos = null;
            mIsWrite = true;
            mSdWrite.setText( R.string.sd_write_ok );
            if( DEBUG )
                Log.d( LOG, "MEDIA_WROTE" );
        }
        catch( Exception e )
        {
            if( fos != null )
            {
                try
                {
                    fos.close();
                }
                catch( IOException e1 )
                {
                    e1.printStackTrace();
                }
                fos = null;
            }
            mIsWrite = false;
            mSdWrite.setText( R.string.sd_write_fail );
            e.printStackTrace();
            return false;
        }
        return true;
    }
    
// 파일 읽기
    private boolean readFile()
    {
        FileInputStream fis = null;
       
        try
        {
            fis = new FileInputStream( mFile );
            fis.read( mTestFile );
            fis.close();
            fis = null;
            mIsRead = true;
            mSdRead.setText( R.string.sd_read_ok );
            if( DEBUG )
                Log.d( LOG, "MEDIA_READ" );
           
            mFile.delete();
           
            if( DEBUG )
                Log.d( LOG, "MEDIA_DELETED" );
        }
        catch( Exception e )
        {
            if( fis != null )
            {
                try
                {
                    fis.close();
                }
                catch( IOException e1 )
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                fis = null;
            }
            mIsRead = true;
            mSdRead.setText( R.string.sd_read_fail );
           
            return false;
        }
        return true;
    }
반응형
Posted by 컴투

sdcard 파일 입출력

참조(공식 안드로이드 개발 사이트): http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

1. sdcard 에 접근하기 위해 manifest 파일에 permission 을 추가해 준다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. sdcard 가 마운트 되었는지 또는 쓰기 가능한지 등의 상태를 확인한다.
String state = Environment.getExternalStorageState()
 - state 가 Environment.MEDIA_MOUNTED 이면 마운트되어 있고 쓰기 가능하다.
 - state 가 MEDIA_MOUNTED_READ_ONLY 이면 마운트되어 있고 읽기만 가능하다.
 - 그외 는 sdcard 에 접근 할 수 없는 경우다.

3. . sdcard 의 File 객체를 받는다.
API level 7 까지는 Environment.getExternalStorageDirectory() 를 사용한다.
API level 8 부터는 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 를 사용할 수 있다.
예) File path = Environment.getExternalStorageDirectory();

4. File 객체를 만든다.
위에서 받은 File 객체를 path 로 넣어준다.
예) File file = new File(path, "filename");

5. 파일을 조작한다.
 - 바이너리 파일 입출력은 FileInputStream/FileOutputStream 클래스를 이용한다.
 - 텍스트 파일 입출력은 BufferedReader/BufferedWriter 클래스를 이용한다.

#) getExternalStorageDirectory 함수를 사용하지 않고 "/sdcard/filename" 등의 경로를 File 생성자에 직접 넣어주면 IllegalArgumentException (예 'File /sdcard/filename contains a path separator') 이 발생한다
반응형
Posted by 컴투